{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c301b81f-9646-448c-afa8-b06dfc225b0a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\17828\\AppData\\Local\\Temp\\jieba.cache\n",
      "Loading model cost 3.384 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始训练模型...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\17828\\AppData\\Roaming\\Python\\Python312\\site-packages\\xgboost\\training.py:183: UserWarning: [11:01:07] WARNING: C:\\actions-runner\\_work\\xgboost\\xgboost\\src\\learner.cc:738: \n",
      "Parameters: { \"use_label_encoder\" } are not used.\n",
      "\n",
      "  bst.update(dtrain, iteration=i, fobj=obj)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型训练完成!\n",
      "\n",
      "模型评估...\n",
      "分类报告：\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.81      0.63      0.71        79\n",
      "           1       0.57      0.88      0.69        67\n",
      "           2       0.50      0.14      0.22        28\n",
      "\n",
      "    accuracy                           0.65       174\n",
      "   macro avg       0.62      0.55      0.54       174\n",
      "weighted avg       0.67      0.65      0.62       174\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30495 (\\N{CJK UNIFIED IDEOGRAPH-771F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 23454 (\\N{CJK UNIFIED IDEOGRAPH-5B9E}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 26631 (\\N{CJK UNIFIED IDEOGRAPH-6807}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 31614 (\\N{CJK UNIFIED IDEOGRAPH-7B7E}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 39044 (\\N{CJK UNIFIED IDEOGRAPH-9884}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 27979 (\\N{CJK UNIFIED IDEOGRAPH-6D4B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAIhCAYAAADejQtoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABDUUlEQVR4nO3dd3gU5f7+8XtDSQKEQIAkVAkkcOhdSCxBpQiKIB7OkaJgBUEQMaKoSICQKF8FxAJioXhE8VgAK00IIEV6l2YoKhFQWkhIJJnfH/yIZ02ELLCZYZ/3i2uvi52Znf1sXOHD/TzzjMuyLEsAAAAwhp/dBQAAAKBw0QACAAAYhgYQAADAMDSAAAAAhqEBBAAAMAwNIAAAgGFoAAEAAAxDAwgAAGAYGkAAAADDFLW7AAC+b8eOHYqOjr7gMcuWLdMNN9xwwWPWrFmjs2fPXvRcnhwXFRV1wWMAwBfRAALwuuzsbNWvX1/Lly/Pd//1118vl8t10WOys7MLdC5PjgMAEzEEDAAAYBgaQAAAAMPQAAIAABiGBhAAAMAwNIAAAACGoQEEAAAwDA0gAACAYWgAAQAADEMDCAAAYBgaQAAAAMPQAAIAABiGBhAAAMAwRe0uAIDvK1KkiDZt2qQyZcrkuz87O1vZ2dkXPcbPz69A5/LkOAAwkcuyLMvuIgAAAFB4+OcvAACAYWgAAQAADEMDCAAAYBgaQAAAAMP45FXAwT3es7sEII+hD0TbXQLg5onYSLtLANwE2NiVBDZ51GvnztjwmtfOfalIAAEAAAzjkwkgAACAR1xmZWI0gAAAAC6X3RUUKrPaXQAAAJAAAgAAmDYEbNanBQAAAAkgAAAAcwABAADg00gAAQAAmAMIAAAAX0YCCAAAYNgcQBpAAAAAhoABAADgy0gAAQAADBsCJgEEAAAwDAkgAAAAcwABAADgy0gAAQAAmAMIAAAAX0YCCAAAYNgcQBpAAAAAhoABAADgy0gAAQAADBsCNuvTAgAAgAQQAACABBAAAAA+jQQQAADAj6uAAQAA4MNIAAEAAAybA0gDCAAAwELQAAAA8GUkgAAAAIYNAZv1aQEAAEACCAAAwBxAAAAA+DQSQAAAAOYAAgAAwJeRAAIAABg2B5AGEAAAgCFgAAAA+DISQAAAAMOGgEkAAQAADEMCCAAAwBxAAAAA+DISQAAAAOYAAgAAwJeRAAIAABg2B5AGEAAAwLAG0KxPCwAAABJAAAAALgIBAACATyMBBAAAYA4gAAAAfJljGsBly5apV69eio6O1s8//yxJeu+997R8+XKbKwMAAD7P5fLew4Ec0QB+8sknat++vQIDA7VhwwZlZmZKkk6dOqXExESbqwMAAPAtjmgAExISNHnyZL311lsqVqxY7vaYmBitX7/exsoAAIARXH7eeziQIy4C2blzp2688cY820uXLq3jx48XfkEAAMAsDh2q9RZHtKUVK1bUnj178mxfvny5atSoYUNFAAAAvssRDWDfvn312GOPafXq1XK5XPrll1/0/vvvKy4uTv3797e7PAAA4ONcLpfXHk7kiCHgoUOH6sSJE7rpppt05swZ3XjjjfL391dcXJweffRRu8sDAADwKY5oACVpzJgxevbZZ7V9+3bl5OSobt26KlWqlN1lAQAAAzg1qfMWRwwBT58+XadPn1aJEiXUvHlzXXvttTR/AAAAXuKIBjAuLk6hoaG6++679cUXX+js2bN2lwQAAEzi8uLDgRzRAB46dEizZs1SkSJFdPfdd6tixYrq37+/VqxYYXdpAAAAPscRDWDRokV1++236/3339fhw4c1YcIE7d+/XzfddJNq1qxpd3kAAMDHcRWwzUqUKKH27dvr2LFj2r9/v3bs2GF3SQAAwMc5tVHzFkckgJKUnp6u999/Xx07dlSlSpU0fvx4denSRVu3brW7NAAAAJ/iiASwe/fu+vzzz1WiRAl169ZNS5YsUUxMjN1lAQAAQ5AA2sDlcmnWrFn65Zdf9Prrr9P8AQAAI8XHx+eZQxgeHp6737IsxcfHq1KlSgoMDFTr1q21bds2j9/HEQngzJkz7S4BAAAYzEkJYL169bRw4cLc50WKFMn9/dixYzVu3DhNmzZNtWrVUkJCgtq2baudO3cqKCiowO9hWwM4ceJEPfzwwwoICNDEiRMveOygQYMKqSrzPH1XQw27q5Hbtl+PZ6hW/4/djulzc5TKlCyutXuOKm7q9/rh5xOFXSoMseWbj3Rg4wqd+PUnFS1WXBVq1FHTO+9TcFiV3GNm9L8t39c2vfN+1W97V2GVCoO989abWrRgvlJSfpR/QIAaN26iwUPiVD2iht2lwQcULVrULfU7z7IsTZgwQc8++6y6du0q6dzNNMLCwjRz5kz17du34O9xxar10Pjx49WzZ08FBARo/Pjxf3ucy+WiAfSy7QePq3Pigtzn2TlW7u8Hd6qnAR3qqP+bK7Tn0Ck9eWcDzX6mjZo/MUdpZ1iwG1fer3u2qHbsbSp/TS3l5GRrw9wZWvjqc7pj+GQV8w+QJHVLes/tNT9vX6cV/3lF1zRh+ggKx9o13+vf3XuqXoMGyj6brVcnjle/hx7Qp3O/VIkSJewuD5fCiwFgZmamMjMz3bb5+/vL398/3+N3796tSpUqyd/fXy1btlRiYqJq1KihlJQUpaamql27dm7niY2N1YoVK66OBjAlJSXf36Pwnc3O0eETZ/Ld98it/9DLc7bq8zUHJUn9Jn2n3ZO6qVtMhKZ+u7swy4Qh2jw62u35dfc8ro+e6qHfD+xRWFR9SVJgcIjbMQc3rVJ4rYYKKl+x0OqE2SZNecft+aiEJN10Q7R2bN+mZs1b2FQVnCopKUkjR4502zZixAjFx8fnObZly5aaMWOGatWqpV9//VUJCQmKiYnRtm3blJqaKkkKCwtze01YWJj279/vUU2OuAhk1KhRSk9Pz7M9IyNDo0aNsqEis9QML60fXr9LmyfcqXcH3qDqoefuw1w9tJTCy5bQt5t/yT0262yOvtvxq66tVcGucmGYrIzTkqTiJfO/P3jGyWP6aesaRca0y3c/UBjSTp2SJJUODra5Elwqby4EPWzYMJ04ccLtMWzYsHzr6NChg+666y41aNBAbdq00Zdffinp3FDv/9b6vyzL8ngOoyMawJEjRyotLS3P9vT09DwdM66stXuOqt+k79T1hUUa9PZKhQYHaH78rSpbqrhCgwMlKU86eOTkGYWVCbSjXBjGsiyt/eQthdasp7KVqud7zN5Vi1QsIFDXNGb4F/awLEsvjU1Sk6bNFBVVy+5y4ED+/v4qXbq02+Pvhn//qmTJkmrQoIF2796dOy/wfBJ43uHDh/OkghfjiAbw7zrXTZs2KSQkJJ9X/CkzM1MnT550e1jZf3irVJ+zcNMvmrvmgLYfPK4lW1P1r/9bLEnqceOft+Cz/vIal879NwO87ftZk3Ts53264f6hf3vMnpULFNGitYoUK16IlQF/SkoYpd27dunF/xtndym4DE69FVxmZqZ27NihihUrKiIiQuHh4Vqw4M95+1lZWUpOTvZ4CT1bG8CyZcsqJCRELpdLtWrVUkhISO4jODhYbdu21b/+9a8LniMpKUnBwcFuj8ztnxfSJ/A96Zlntf3gcdUMD9LhExmSpLDgALdjypcO+Ns5g8CVsnrWJB3cvFrtBiepZNny+R7z656tOvnrT4q6rn0hVweckzRmtJYs+VZvTZ2usHyu2sTVwykNYFxcnJKTk5WSkqLVq1frn//8p06ePKnevXvL5XJp8ODBSkxM1GeffaatW7eqT58+KlGihHr06OHR+9i6DuCECRNkWZbuv/9+jRw5UsH/M3eiePHiql69uqKjoy94jmHDhmnIkCFu26o89PHfHI2LKV7UT7UqldaKH37VvsNpSj2WrpsaVNTm/cckScWK+Om6OmGK/2C9zZXCV1mWpe8/mqwDG1eq/eNJCir/93+p7lkxX+WqRSqkCktvoHBZlqWkMaP17aIFemfae6pSpardJcFH/PTTT+revbuOHj2qChUqqFWrVlq1apWuueYaSdLQoUOVkZGh/v3769ixY2rZsqXmz5/v0RqAks0NYO/evSVJERERiomJUbFixTw+R36XUbuKeH4eUyX0aKqv1/+kn35LV/nSAXryzgYKCiymD5b9KEma9M0PGtK5gfamntLe1FN6onN9ZWSd1X9XcOU2vGP1h28oZW2ybuo7XMX8A5Vx4ndJUrHAkipa/M//17My0rV//XI16/qgXaXCYImjR+rrr77QhFffUMkSJXX0yBFJUqmgIAUEBFzk1XAipywE/eGHH15wv8vlUnx8fL5XEHvCtgbw5MmTKl26tCSpSZMmysjIUEZGRr7Hnj8OV16lciX1zsAbVC7IX0dPZmrtniNqM+IbHTx67srLCZ9vU0DxInr5vmtVpqS/1u49qjuTFrEGILxm17KvJEnzJzzttj3mnsGKjG6b+3zfumRZlhTRIrZQ6wMk6aNZH0iSHuhzj9v2UQlJ6nxnVztKAjzismyazV+kSBEdOnRIoaGh8vPzy7fzPn9xSHZ2tkfnDu7x3sUPAgrZ0AcuPJ0BKGxPxEbaXQLgJsDGcclyvT/w2rl/m97da+e+VLb9qL/99tvcK3wXL15sVxkAAADGsa0BjI2Nzff3AAAAhc0pcwALiyPWAfzmm2+0fPny3Oevv/66GjdurB49eujYsWM2VgYAAOB7HNEAPvnkkzp58qQkacuWLRoyZIg6duyoH3/8Mc8SLwAAAFeaU9YBLCy2LgNzXkpKiurWrStJ+uSTT9SpUyclJiZq/fr16tixo83VAQAAX+fURs1bHJEAFi9eXOnp6ZKkhQsXql27czd1DwkJyU0GAQAAcGU4IgG8/vrrNWTIEF133XX6/vvvNWvWLEnSrl27VKVKFZurAwAAPs+sANAZCeBrr72mokWL6uOPP9akSZNUuXJlSdLXX3+tW2+91ebqAAAAfIsjEsBq1arpiy++yLN9/PjxNlQDAABMY9ocQEc0gJKUnZ2t2bNna8eOHXK5XKpTp446d+6sIkWK2F0aAACAT3FEA7hnzx517NhRP//8s2rXri3LsrRr1y5VrVpVX375pWrWrGl3iQAAwIeZlgA6Yg7goEGDVLNmTR08eFDr16/Xhg0bdODAAUVERGjQoEF2lwcAAOBTHJEAJicna9WqVbn3BpakcuXK6YUXXtB1111nY2UAAMAEpiWAjmgA/f39derUqTzb09LSVLx4cRsqAgAAJjGtAXTEEPDtt9+uhx9+WKtXr5ZlWbIsS6tWrVK/fv10xx132F0eAACAT3FEAzhx4kTVrFlT0dHRCggIUEBAgGJiYhQZGalXXnnF7vIAAICvc3nx4UCOGAIuU6aM5syZoz179mj79u2SpLp16yoyMtLmygAAAHyPIxpASXrnnXc0fvx47d69W5IUFRWlwYMH68EHH7S5MgAA4OtMmwPoiAZw+PDhGj9+vAYOHKjo6GhJ0sqVK/X4449r3759SkhIsLlCAAAA3+GIBnDSpEl666231L1799xtd9xxhxo2bKiBAwfSAAIAAK8yLQF0xEUg2dnZat68eZ7tzZo109mzZ22oCAAAwHc5ogHs1auXJk2alGf7lClT1LNnTxsqAgAAJnG5XF57OJEjhoClcxeBzJ8/X61atZIkrVq1SgcPHtS9996rIUOG5B43btw4u0oEAAC+ypl9mtc4ogHcunWrmjZtKknau3evJKlChQqqUKGCtm7dmnucU7toAACAq4kjGsDFixfbXQIAADCYaSGTI+YAAgAAoPA4IgEEAACwEwkgAAAAfBoJIAAAMB4JIAAAAHwaCSAAADCeaQkgDSAAAIBZ/R9DwAAAAKYhAQQAAMYzbQiYBBAAAMAwJIAAAMB4JIAAAADwaSSAAADAeIYFgCSAAAAApiEBBAAAxjNtDiANIAAAMJ5h/R9DwAAAAKYhAQQAAMYzbQiYBBAAAMAwJIAAAMB4hgWAJIAAAACmIQEEAADG8/MzKwIkAQQAADAMCSAAADCeaXMAaQABAIDxWAYGAAAAPo0EEAAAGM+wAJAEEAAAwDQkgAAAwHjMAQQAAIBPIwEEAADGIwEEAACATyMBBAAAxjMsAKQBBAAAYAgYAAAAPo0EEAAAGM+wAJAEEAAAwDQkgAAAwHjMAQQAAIBPIwEEAADGMywAJAEEAAAwDQkgAAAwHnMAAQAA4NNoAAEAgPFcLu89LkdSUpJcLpcGDx6cu82yLMXHx6tSpUoKDAxU69attW3bNo/OSwMIAACM53K5vPa4VGvWrNGUKVPUsGFDt+1jx47VuHHj9Nprr2nNmjUKDw9X27ZtderUqQKfmwYQAADAYdLS0tSzZ0+99dZbKlu2bO52y7I0YcIEPfvss+ratavq16+v6dOnKz09XTNnzizw+WkAAQCA8bw5BJyZmamTJ0+6PTIzMy9Yz4ABA3TbbbepTZs2bttTUlKUmpqqdu3a5W7z9/dXbGysVqxYUeDP65NXAe95s7vdJQB5VLtxsN0lAG6eWPOa3SUARkhKStLIkSPdto0YMULx8fH5Hv/hhx9q/fr1WrNmTZ59qampkqSwsDC37WFhYdq/f3+Ba/LJBhAAAMAT3lwGZtiwYRoyZIjbNn9//3yPPXjwoB577DHNnz9fAQEBf3vOv9ZrWZZHn4EGEAAAwIv8/f3/tuH7q3Xr1unw4cNq1qxZ7rbs7GwtXbpUr732mnbu3CnpXBJYsWLF3GMOHz6cJxW8EOYAAgAA4zllGZhbbrlFW7Zs0caNG3MfzZs3V8+ePbVx40bVqFFD4eHhWrBgQe5rsrKylJycrJiYmAK/DwkgAACAQwQFBal+/fpu20qWLKly5crlbh88eLASExMVFRWlqKgoJSYmqkSJEurRo0eB34cGEAAAGO9quhXc0KFDlZGRof79++vYsWNq2bKl5s+fr6CgoAKfw2VZluXFGm1x5NRZu0sA8uAqYDjNMa4ChsME2BhLXf/SMq+de3ncDV4796ViDiAAAIBhGAIGAADGu5qGgK8EEkAAAADDkAACAADjkQACAADAp5EAAgAA4xkWAJIAAgAAmIYEEAAAGM+0OYA0gAAAwHiG9X8MAQMAAJiGBBAAABjPtCFgEkAAAADDkAACAADjGRYAkgACAACYhgQQAAAYz8+wCJAEEAAAwDAkgAAAwHiGBYA0gAAAACwDAwAAAJ9GAggAAIznZ1YASAIIAABgGhJAAABgPOYAAgAAwKeRAAIAAOMZFgCSAAIAAJiGBBAAABjPJbMiQBpAAABgPJaBAQAAgE8jAQQAAMZjGRgAAAD4NBJAAABgPMMCQBJAAAAA05AAAgAA4/kZFgGSAAIAABiGBBAAABjPsACQBhAAAIBlYAAAAODTSAABAIDxDAsASQABAABMQwIIAACMxzIwAAAA8GkkgAAAwHhm5X8kgAAAAMYhAQQAAMYzbR1AGkAAAGA8P7P6P4aAAQAATEMCCAAAjGfaEDAJIAAAgGFIAAEAgPEMCwDtawAnTpxY4GMHDRrkxUoAAADMYlsDOH78+AId53K5aAABAIBXmTYH0LYGMCUlxa63BgAAMBpzAAEAgPFMWwfQMQ3gTz/9pLlz5+rAgQPKyspy2zdu3DibqgIAACZgCNgGixYt0h133KGIiAjt3LlT9evX1759+2RZlpo2bWp3eQAAAD7FEesADhs2TE888YS2bt2qgIAAffLJJzp48KBiY2PVrVs3u8sDAAA+zuXFhxN5lAD26dNHu3btKvDxdevW1dtvv33R43bs2KEPPvjgXEFFiyojI0OlSpXSqFGj1LlzZz3yyCOelAkAAIAL8KgB3Lx5s9avX1/g46+99toCHVeyZEllZmZKkipVqqS9e/eqXr16kqSjR496UiIAAIDH/JgDWPhatWql7777TnXr1tVtt92mJ554Qlu2bNGnn36qVq1a2V0eAACAT3FEAzhu3DilpaVJkuLj45WWlqZZs2YpMjKywAtGAwAAXCrDAkD7G8Ds7GwdPHhQDRs2lCSVKFFCb7zxhs1VAQAA+C7brwIuUqSI2rdvr+PHj9tdCgAAMJTL5fLaw4k8SgAty9L9999f4GMtyyrQsQ0aNNCPP/6oiIgIT8oBAADAJfCoAZw9e7bOnDlT4OMDAwMLdNyYMWMUFxen0aNHq1mzZipZsqTb/tKlS3tSJgAAgEccGtR5jUcN4Lp16zxaliU0NFTVqlW76HG33nqrJOmOO+5wi0oty5LL5VJ2drYnZeIKOHL4V016dZxWrVimzDOZqnrNNXp6+Gj9o049u0uDj3u2b0c916+j27bUoycV0fYZSVJoSJASHuusNtF1FFwqUMvX79GQsf/V3gNH7CgXhnrnrTe1aMF8paT8KP+AADVu3ESDh8SpekQNu0vDJWIZmAtISEjQ4MGDCzy0m5iYqC5dulz0uMWLF3tSBrzs5MkTeuSBXmra/Fq99MpklQ0pp59/OqigoCC7S4Mhtu35Rbf1ezX3eXbOn3/mfDT+Yf1xNlvdBr+pk6fPaFCvm/XV5IFq0jVB6Wey8jsdcMWtXfO9/t29p+o1aKDss9l6deJ49XvoAX0690uVKFHC7vKAi/J4DuC9995b4ONfe+21Ah0XERGhqlWr5pkoaVmWDh486EmJuALen/6OQsPC9cyIMbnbKlaqbGNFMM3Z7Bz9+tupPNsjq4WqZcMINb0rQTt+TJUkPZY0SwcWvaB/dWimaZ+tLOxSYahJU95xez4qIUk33RCtHdu3qVnzFjZVhcthWADo2VXAnl7JUtDjIyIidORI3uGb33//nQtDbPDd0sX6R516eu6px3V72xt0X4+7NPez/9pdFgwSWa2Cfpw/Rju+iNeMF+5T9crlJEn+xc/9m/VM1tncY3NyLGX9cVYxjWvaUisgSWmnzv2DpXRwsM2VAAVj+zIw0p9z/f4qLS1NAQEBNlRktl9+/kmzP5mlqtWu0bhXp6jzXf/WhJeS9PUXc+wuDQZYs3WfHhz+njr1f139R3+gsHKltXjaEwoJLqmd+1K1/5ffNHrgHSoTFKhiRYso7r62qlghWOHl+YsX9rAsSy+NTVKTps0UFVXL7nJwiVgGphANGTJE0rkf+vDhw93mTWRnZ2v16tVq3LjxBc+RmZmZex/h3G1ZReTv73/F6zVFTk6O/lG3vvoOGCxJqvWPOtr34x7N/mSWOtze2d7i4PPmf7c99/fb9kirN6Vo2+fx6tWppSb+51t1j3tbk0b01KGl/6ezZ7P17eqd+mb5NhsrhumSEkZp965dmvbeTLtLAQrM4zmAS5cuLfCxF7tYZMOGDbnHbtmyRcWLF8/dV7x4cTVq1EhxcXEXPEdSUpJGjhzpti3u6eEa+szzBaoTeZUrX0HVI9yH066JqKEl3y6wqSKYLP1Mlrbt+UU1q1WQJG3YcVCt7n5BpUsFqHixojp6LE1LZ8Rp3fYDNlcKEyWNGa0lS77Vu9P/o7DwcLvLwWVwxJCopEmTJmnSpEnat2+fJKlevXp6/vnn1aFDB0nneqaRI0dqypQpOnbsmFq2bKnXX39d9ep5tkqHRw3g/fffr6+//rrAx/fp0+eC+89f/XvffffplVdeuaT1/oYNG5abJJ53MquIx+fBnxo0aqID+1Pcth3cv0/hFSvZVBFMVrxYUf0jIkzfbdjjtv1k2rk1SWtWq6Cmdatp5Btf2FEeDGVZlpLGjNa3ixbonWnvqUqVqnaXBB9RpUoVvfDCC4qMjJQkTZ8+XZ07d9aGDRtUr149jR07VuPGjdO0adNUq1YtJSQkqG3bttq5c6dHq3W4rIKu6SLp7NmzysnJKfDJ/fz8VLRo4Y8yHzl19uIH4W/t2LZF/e7vpQf6DtDNbdtr+7YtGpsQr6HPxqtdh9vtLu+qVe3GwXaXcFVIevxOfbl0iw4eOqbQkFJ66sFbdUOzSLX4V6IOHDqmrm2a6MixNB1M/V31oyrppSf/qQ07Dqp73Nt2l37VObamYCs1IK8xo+L19VdfaMKrb6h69T8vViwVFMTc9csQYOPEtEGzf/DauSd2+cdlvT4kJET/93//p/vvv1+VKlXS4MGD9dRTT0k6NxUuLCxML774ovr27Vvgc3r0o7722mtVpkyZAh1rWZbS09O1evXqix578803X3D/t99+W6D3xJVRp14DJb70it58bYKmvT1JFStV0aAnnqL5Q6GoHFZGM5LuU7kyJXX0WJq+37JPsb1f1oFDxyRJ4RVK68Unuiq0XJBSj57U+1+sVtKUb2yuGqb5aNYHkqQH+tzjtn1UQpI639nVjpJwmfy8eK1Gftcr+Pv7X/R6hezsbP33v//V6dOnFR0drZSUFKWmpqpdu3Zu54mNjdWKFSu81wBaluVRM9aiRcHWQmrUqJHb8z/++EMbN27U1q1b1bt3b09KxBVy3Q2tdd0Nre0uAwa69+mpF9z/xgfJeuOD5EKqBsjfpm077S4BV5H8rlcYMWKE4uPj8z1+y5Ytio6O1pkzZ1SqVCl99tlnqlu3rlasWCFJCgsLczs+LCxM+/fv96gmjxpAb60DOH78+Hy3x8fHKy0tzaP3BAAA8JQ3E8D8rle4UPpXu3Ztbdy4UcePH9cnn3yi3r17Kzn5z3/45nfjDE97NKdc9JKvXr166d1337W7DAAAgEvm7++v0qVLuz0u1AAWL15ckZGRat68uZKSktSoUSO98sorCv//V5qnpqa6HX/48OE8qeDFOLoBXLlyJZNpAQCA1zl5IWjLspSZmamIiAiFh4drwYI/l2XLyspScnKyYmJiPDqnrQtBn9e1q/uEWcuydOjQIa1du1bDhw+3qSoAAIDC9cwzz6hDhw6qWrWqTp06pQ8//FBLlizRN998I5fLpcGDBysxMVFRUVGKiopSYmKiSpQooR49enj0Ph41gOXKlfOowyxfvnyBjgv+y70T/fz8VLt2bY0aNcrtShcAAABv8OYcQE/8+uuvuueee3To0CEFBwerYcOG+uabb9S2bVtJ0tChQ5WRkaH+/fvnLgQ9f/58j9YAlDxsAJs3b567MnVBnF/E8GKmTr3wVX8AAAAmeOeddy643+VyKT4+/m+vIC4ojxrAefPmafbs2Re9xdt53bp10+jRowt07PHjx/Xxxx9r7969evLJJxUSEqL169crLCxMlStX9qRMAAAAj1yBqXpXFY/XAaxWrZpHxxfE5s2bdcstt6hMmTLat2+fHnroIYWEhOizzz7T/v37NWPGDE/KBAAA8IifYR2gR1cBe2sdwCFDhui+++7T7t273a767dChg5YuXerRewIAAODCHHEV8Jo1a/Tmm2/m2V65cuU8a90AAABcaY5eF88LHPF5AwICdPLkyTzbd+7cqQoVKthQEQAAgO/yeA7gqFGjCnxsQXXu3FmjRo3SRx99JOnc0PGBAwf09NNP66677vKkRAAAAI8ZNgXQswbwjTfeyDep+zvt27cv0HEvvfSSOnbsqNDQUGVkZCg2Nlapqalq1aqVxowZ40mJAAAAuAiPGsDo6GivFFG6dGktX75cixcv1rp165STk6OmTZuqTZs2Xnk/AACA/2XaVcCOuAhEkhYtWqRFixbp8OHDysnJ0Q8//KCZM2dKkt59912bqwMAAPAdjmgAR44cqVGjRql58+aqWLHiFblxMgAAQEGZ1no4ogGcPHmypk2bpnvuucfuUgAAgIGcci/gwuKIZWCysrIUExNjdxkAAABGcEQD+OCDD+bO9wMAAChsfi6X1x5O5Igh4DNnzmjKlClauHChGjZsqGLFirntHzdunE2VAQAA+B5HNICbN29W48aNJUlbt25128cFIQAAwNtMazcc0QAuXrzY7hIAAACM4YgGEAAAwE5cBQwAAACfRgIIAACM55JZESANIAAAMB5DwAAAAPBpJIAAAMB4JIAAAADwaSSAAADAeKbdeIIEEAAAwDAkgAAAwHjMAQQAAIBPIwEEAADGM2wKIA0gAACAn2EdIEPAAAAAhiEBBAAAxuMiEAAAAPg0EkAAAGA8w6YAkgACAACYhgQQAAAYz09mRYAkgAAAAIYhAQQAAMYzbQ4gDSAAADAey8AAAADAp5EAAgAA43ErOAAAAPg0EkAAAGA8wwJAEkAAAADTkAACAADjMQcQAAAAPo0EEAAAGM+wAJAGEAAAwLQhUdM+LwAAgPFIAAEAgPFcho0BkwACAAAYhgQQAAAYz6z8jwQQAADAOCSAAADAeCwEDQAAAJ9GAggAAIxnVv5HAwgAAGDcnUAYAgYAADAMCSAAADAeC0EDAADAp5EAAgAA45mWiJn2eQEAAIxHAggAAIzHHEAAAAD4NBJAAABgPLPyPxJAAAAA45AAAgAA45k2B5AGECgkX34w0u4SADdZZ3PsLgFwE1DUvoFJ04ZETfu8AAAAxiMBBAAAxjNtCJgEEAAAwDA0gAAAwHguLz48kZSUpBYtWigoKEihoaHq0qWLdu7c6XaMZVmKj49XpUqVFBgYqNatW2vbtm0evQ8NIAAAgEMkJydrwIABWrVqlRYsWKCzZ8+qXbt2On36dO4xY8eO1bhx4/Taa69pzZo1Cg8PV9u2bXXq1KkCv4/LsizLGx/ATkdOnbW7BCCPLT+fsLsEwE3z6mXtLgFwUzrAvlxqzpZUr527c4PwS37tkSNHFBoaquTkZN14442yLEuVKlXS4MGD9dRTT0mSMjMzFRYWphdffFF9+/Yt0HlJAAEAALwoMzNTJ0+edHtkZmYW6LUnTpwLD0JCQiRJKSkpSk1NVbt27XKP8ff3V2xsrFasWFHgmmgAAQCA8fzk8tojKSlJwcHBbo+kpKSL1mRZloYMGaLrr79e9evXlySlpp5LKsPCwtyODQsLy91XECwDAwAAjOfNVWCGDRumIUOGuG3z9/e/6OseffRRbd68WcuXL8+z76/L1liW5dFSNjSAAAAAXuTv71+ghu9/DRw4UHPnztXSpUtVpUqV3O3h4efmE6ampqpixYq52w8fPpwnFbwQhoABAIDxXF785QnLsvToo4/q008/1bfffquIiAi3/REREQoPD9eCBQtyt2VlZSk5OVkxMTEFfh8SQAAAAIcYMGCAZs6cqTlz5igoKCh3Xl9wcLACAwPlcrk0ePBgJSYmKioqSlFRUUpMTFSJEiXUo0ePAr8PDSAAADCeU+4EN2nSJElS69at3bZPnTpVffr0kSQNHTpUGRkZ6t+/v44dO6aWLVtq/vz5CgoKKvD7sA4gUEhYBxBOwzqAcBo71wH8atthr527Y71Qr537UpEAAgAA4/l5fNO2qxsXgQAAABiGBBAAABjPKXMACwsNIAAAMJ5pDSBDwAAAAIYhAQQAAMbzdMHmqx0JIAAAgGFIAAEAgPH8zAoASQABAABMQwIIAACMxxxAAAAA+DQSQAAAYDzT1gGkAQQAAMZjCBgAAAA+jQQQAAAYj2VgAAAA4NNIAAEAgPGYAwgAAACfRgIIAACMZ9oyMCSAAAAAhiEBBAAAxjMsAKQBBAAA8DNsDJghYAAAAMOQAAIAAOOZlf+RAAIAABiHBBAAAMCwCJAEEAAAwDAkgAAAwHjcCg4AAAA+jQQQAAAYz7BlAGkAAQAADOv/GAIGAAAwDQkgAACAYREgCSAAAIBhSAABAIDxWAbGRllZWdq5c6fOnj1rdykAAAA+yxENYHp6uh544AGVKFFC9erV04EDByRJgwYN0gsvvGBzdQAAwNe5XN57OJEjGsBhw4Zp06ZNWrJkiQICAnK3t2nTRrNmzbKxMgAAAN/jiDmAs2fP1qxZs9SqVSu5/qdVrlu3rvbu3WtjZQAAwAQODeq8xhEN4JEjRxQaGppn++nTp90aQgAAAK8wrN1wxBBwixYt9OWXX+Y+P9/0vfXWW4qOjrarLAAAAJ/kiAQwKSlJt956q7Zv366zZ8/qlVde0bZt27Ry5UolJyfbXR4AAPBxLANjg5iYGH333XdKT09XzZo1NX/+fIWFhWnlypVq1qyZ3eUBAAD4FEckgJLUoEEDTZ8+3e4yAACAgUy75MARCeBNN92kd955RydOnLC7FAAAAJ/niAawQYMGeu655xQeHq677rpLs2fPVlZWlt1lAQAAQ7i8+HAiRzSAEydO1M8//6w5c+YoKChIvXv3Vnh4uB5++GEuAgEAALjCXJZlWXYX8VdnzpzR559/rjFjxmjLli3Kzs726PVHTnEvYTjPlp+Z4gBnaV69rN0lAG5KB9iXS206eMpr525UNchr575UjrkI5LzU1FR9+OGH+s9//qPNmzerRYsWdpcEAAB8HMvA2ODkyZOaOnWq2rZtq6pVq2rSpEnq1KmTdu3apdWrV9tdHgAAgE9xRAIYFhamsmXL6l//+pcSExNJ/QAAQKEybRkYRzSAc+bMUZs2beTn54hAEgAAwKc5ogFs166d3SUAAACDGRYA2tcANm3aVIsWLVLZsmXVpEkTuS6Qva5fv74QKwMAAPBttjWAnTt3lr+/f+7vL9QAAgAAeJVhbYgj1wG8XKwDCCdiHUA4DesAwmnsXAdw689pXjt3/cqlvHbuS+WIqy5q1Kih3377Lc/248ePq0aNGjZUhCOHf9Wo4U+p4y0xuuW6ZurTo6t+2LHN7rJgiN3bNuiNhCf1dJ879EjnGG1c5X5HoDMZ6frwzZc17P7OGtSttUYO6K7krz+1qVpAmvrOFLVoVEcvj020uxRcIpcXfzmRIy4C2bdvX753+8jMzNRPP/1kQ0VmO3nyhB55oJeaNr9WL70yWWVDyunnnw4qKMh5K5nDN2WeOaPK1SMVfcttmvLCM3n2f/zOK9q1Zb3ue3yEyoVW1PaNq/Xh5JdVJqS8GrW80YaKYbJtW7do9scfKapWbbtLAQrM1gZw7ty5ub+fN2+egoODc59nZ2dr0aJFioiIsKM0o70//R2FhoXrmRFjcrdVrFTZxopgmvrNolW/WfTf7v9x51a1urmjajVoKkm6oX0XLZs3R/v3/EADiEKVnn5azw97Us+MGKV335psdzm4DKZdimBrA9ilSxdJksvlUu/evd32FStWTNWrV9fLL79sQ2Vm+27pYl3b6jo999Tj2rh+rSpUCNWd3e7WHXd2s7s0QJIUWaeRNn+/TDFtbldwSHnt2rJeh38+qLoPDra7NBhmbOJoXXdjrFq2iqEBvMoZ1v/Z2wDm5ORIkiIiIrRmzRqVL1/eznLw//3y80+a/cks/btnb91738Pavm2LJryUpGLFiqvD7Z3tLg/Qvx56XP95/QUNu7+z/IoUkZ/LT70efVqRdRvZXRoMMv/rL/XDju2aPvO/dpcCeMwRcwBTUlIu+bWZmZnKzMx035ZVJHeJGXguJydH/6hbX30HDJYk1fpHHe37cY9mfzKLBhCOsPiL/ypl5zY98uxYhYSGa8+2jfpg8ssqXba86jTmVpLwvtTUQ3p5bJJenfw2f9/4CsMiQEc0gJJ0+vRpJScn68CBA8rKynLbN2jQoL99XVJSkkaOHOm2Le7p4Rr6zPNeqdME5cpXUPWImm7bromooSXfLrCpIuBPWZmZmvOfyeo7LEkNml8nSapSPVIHf9ythbNn0gCiUPywfZt+//033dv9n7nbsrOztWHdWv33w5n6bs0mFSlSxMYKgQtzRAO4YcMGdezYUenp6Tp9+rRCQkJ09OhRlShRQqGhoRdsAIcNG6YhQ4a4bTuZxf90l6NBoyY6sN89lT24f5/CK1ayqSLgT9nZZ5V99qxcLvdVrPyK+MmycmyqCqZp0TJaH3w8x23bqBHPqnr1CN1734M0f1chpy7X4i2OaAAff/xxderUSZMmTVKZMmW0atUqFStWTL169dJjjz12wdf6+/vnid8zWQj6svy7x73qd38vzXh3im5u217bt23R3M8+1tBn4+0uDYY4k5GuI4f+XALqt18P6eCPu1QyqLRCKoQrqn4TfTrtNRUv7q+Q0HDt3rpBqxd/rbvu//t/LAJXUsmSJRUZVcttW2BgoILLlMmzHXAiR9wJpEyZMlq9erVq166tMmXKaOXKlapTp45Wr16t3r1764cffvDofNwJ5PJ9t2yJ3nxtgn46uF8VK1XRv3vey1XAl4k7gRTcri3rNf65R/Nsb3VzR/V+7DmdOPab5syYpO0bv1d62kmFVAjX9e0765Y77ua2kh7gTiBXVt8H7lWt2v/QE0Pzrl2JgrHzTiA7U9O9du7a4SW8du5L5YgGsEKFCvruu+9Uq1Yt1a5dWxMnTlT79u31ww8/qGnTpkpP9+w/Cg0gnIgGEE5DAwinoQEsPI4YAm7SpInWrl2rWrVq6aabbtLzzz+vo0eP6r333lODBg3sLg8AAPg408YOHHEv4MTERFWsWFGSNHr0aJUrV06PPPKIDh8+rClTpthcHQAA8HkuLz4cyBFDwFcaQ8BwIoaA4TQMAcNp7BwC3vWr94aAa4U5bwjYEQkgAACAnVxe/OWppUuXqlOnTqpUqZJcLpdmz57ttt+yLMXHx6tSpUoKDAxU69attW3bNo/ewzFzAPO7cs/lcikgIECRkZHq06ePbrrpJhuqAwAAKDynT59Wo0aNdN999+muu+7Ks3/s2LEaN26cpk2bplq1aikhIUFt27bVzp07FRQUVKD3cEQCeOutt+rHH39UyZIlddNNN6l169YqVaqU9u7dqxYtWujQoUNq06aN5syZc/GTAQAAeMjl8t7DUx06dFBCQoK6du2aZ59lWZowYYKeffZZde3aVfXr19f06dOVnp6umTNnFvg9HJEAHj16VE888YSGDx/utj0hIUH79+/X/PnzNWLECI0ePVqdO3MvWgAAcPXIzMxUZmam27b8bmRRECkpKUpNTVW7du3czhUbG6sVK1aob9++BTqPIxLAjz76SN27d8+z/e6779ZHH30kSerevbt27txZ2KUBAAADePMi4KSkJAUHB7s9kpKSLqnO1NRUSVJYWJjb9rCwsNx9BeGIBDAgIEArVqxQZGSk2/YVK1YoICBAkpSTk3NJnTIAAICdhg0bpiFDhrhtu9ye5q/XTliW5dGdkBzRAA4cOFD9+vXTunXr1KJFC7lcLn3//fd6++239cwz526pM2/ePDVp0sTmSgEAgE/y4np9lzrcm5/w8HBJ55LA82soS9Lhw4fzpIIX4ogG8LnnnlNERIRee+01vffee5Kk2rVr66233lKPHj0kSf369dMjjzxiZ5kAAMBHXcpyLXaIiIhQeHi4FixYkBuMZWVlKTk5WS+++GKBz+OIBlCSevbsqZ49e/7t/sDAwEKsBgAAwB5paWnas2dP7vOUlBRt3LhRISEhqlatmgYPHqzExERFRUUpKipKiYmJKlGiRG5oVhCOaQCPHz+ujz/+WD/++KPi4uIUEhKi9evXKywsTJUrV7a7PAAA4MMuZbkWb1m7dq3b2sfn5w/27t1b06ZN09ChQ5WRkaH+/fvr2LFjatmypebPn1/gNQAlh9wKbvPmzWrTpo2Cg4O1b98+7dy5UzVq1NDw4cO1f/9+zZgxw6PzcSs4OBG3goPTcCs4OI2dt4JLOXrGa+eOKB/gtXNfKkcsAzNkyBD16dNHu3fvzr3qVzq3EOLSpUttrAwAAJjAm8vAOJEjGsA1a9bku3Bh5cqVPVrTBgAAABfniDmAAQEBOnnyZJ7tO3fuVIUKFWyoCAAAGMWpUZ2XOCIB7Ny5s0aNGqU//vhD0rnFDQ8cOKCnn34635sgAwAA4NI5ogF86aWXdOTIEYWGhiojI0OxsbGKjIxUqVKlNGbMGLvLAwAAPs7lxV9O5Igh4NKlS2v58uVavHix1q1bp5ycHDVt2lRt2rSxuzQAAGAAJy0DUxgcsQyMJC1atEiLFi3S4cOHlZOT47bv3Xff9ehcLAMDJ2IZGDgNy8DAaexcBubA75leO3e1kCtzG7gryREJ4MiRIzVq1Cg1b95cFStW9OhmxgAAAJfLtM7DEQ3g5MmTNW3aNN1zzz12lwIAAODzHNEAZmVlKSYmxu4yAACAoUwbfHTEVcAPPvigZs6caXcZAAAARnBEAnjmzBlNmTJFCxcuVMOGDVWsWDG3/ePGjbOpMgAAYAazIkBHNICbN29W48aNJUlbt25128cFIQAAAFeWIxrAxYsX210CAAAwmGl5kyMaQAAAADsZ1v854yIQAAAAFB4SQAAAYDzThoBJAAEAAAxDAggAAIznMmwWIAkgAACAYUgAAQAAzAoASQABAABMQwIIAACMZ1gASAMIAADAMjAAAADwaSSAAADAeCwDAwAAAJ9GAggAAGBWAEgCCAAAYBoSQAAAYDzDAkASQAAAANOQAAIAAOOZtg4gDSAAADAey8AAAADAp5EAAgAA45k2BEwCCAAAYBgaQAAAAMPQAAIAABiGOYAAAMB4zAEEAACATyMBBAAAxjNtHUAaQAAAYDyGgAEAAODTSAABAIDxDAsASQABAABMQwIIAABgWARIAggAAGAYEkAAAGA805aBIQEEAAAwDAkgAAAwHusAAgAAwKeRAAIAAOMZFgDSAAIAAJjWATIEDAAAYBgSQAAAYDyWgQEAAIBPIwEEAADGYxkYAAAA+DSXZVmW3UXAmTIzM5WUlKRhw4bJ39/f7nIAvpNwJL6XuBrRAOJvnTx5UsHBwTpx4oRKly5tdzkA30k4Et9LXI0YAgYAADAMDSAAAIBhaAABAAAMQwOIv+Xv768RI0YwqRmOwXcSTsT3ElcjLgIBAAAwDAkgAACAYWgAAQAADEMDCAAAYBgaQOSxZMkSuVwuHT9+/ILHVa9eXRMmTCiUmgBv4/sMb4uPj1fjxo3tLgOQRAOIfMTExOjQoUMKDg6WJE2bNk1lypTJc9yaNWv08MMPF3J1wDmtW7fW4MGD7S4DyJfL5dLs2bPdtsXFxWnRokX2FAT8RVG7C4DzFC9eXOHh4Rc9rkKFCoVQDXDpLMtSdna2ihbljzrYr1SpUipVqpTdZQCSSACvWq1bt9ajjz6qRx99VGXKlFG5cuX03HPP6fyqPseOHdO9996rsmXLqkSJEurQoYN2796d+/r9+/erU6dOKlu2rEqWLKl69erpq6++kuQ+BLxkyRLdd999OnHihFwul1wul+Lj4yW5D5l1795dd999t1uNf/zxh8qXL6+pU6dKOveX8dixY1WjRg0FBgaqUaNG+vjjj738k4IdWrdurUGDBmno0KEKCQlReHh47vdGkk6cOKGHH35YoaGhKl26tG6++WZt2rQpd3+fPn3UpUsXt3MOHjxYrVu3zt2fnJysV155Jfd7uW/fvtzv7rx589S8eXP5+/tr2bJl2rt3rzp37qywsDCVKlVKLVq00MKFCwvhJ4HCdrnfPUlKSEhQaGiogoKC9OCDD+rpp592G7pds2aN2rZtq/Llyys4OFixsbFav3597v7q1atLku688065XK7c5/87BDxv3jwFBATkmWozaNAgxcbG5j5fsWKFbrzxRgUGBqpq1aoaNGiQTp8+fdk/J4AG8Co2ffp0FS1aVKtXr9bEiRM1fvx4vf3225LO/QW5du1azZ07VytXrpRlWerYsaP++OMPSdKAAQOUmZmppUuXasuWLXrxxRfz/ZdpTEyMJkyYoNKlS+vQoUM6dOiQ4uLi8hzXs2dPzZ07V2lpabnb5s2bp9OnT+uuu+6SJD333HOaOnWqJk2apG3btunxxx9Xr169lJyc7I0fD2w2ffp0lSxZUqtXr9bYsWM1atQoLViwQJZl6bbbblNqaqq++uorrVu3Tk2bNtUtt9yi33//vUDnfuWVVxQdHa2HHnoo93tZtWrV3P1Dhw5VUlKSduzYoYYNGyotLU0dO3bUwoULtWHDBrVv316dOnXSgQMHvPXxYaPL+e69//77GjNmjF588UWtW7dO1apV06RJk9zOf+rUKfXu3VvLli3TqlWrFBUVpY4dO+rUqVOSzjWIkjR16lQdOnQo9/n/atOmjcqUKaNPPvkkd1t2drY++ugj9ezZU5K0ZcsWtW/fXl27dtXmzZs1a9YsLV++XI8++qhXfm4wjIWrUmxsrFWnTh0rJycnd9tTTz1l1alTx9q1a5clyfruu+9y9x09etQKDAy0PvroI8uyLKtBgwZWfHx8vudevHixJck6duyYZVmWNXXqVCs4ODjPcddcc401fvx4y7IsKysryypfvrw1Y8aM3P3du3e3unXrZlmWZaWlpVkBAQHWihUr3M7xwAMPWN27d/f488PZYmNjreuvv95tW4sWLaynnnrKWrRokVW6dGnrzJkzbvtr1qxpvfnmm5ZlWVbv3r2tzp07u+1/7LHHrNjYWLf3eOyxx9yOOf/dnT179kVrrFu3rvXqq6/mPv/f7zOuXpf73WvZsqU1YMAAt/3XXXed1ahRo799z7Nnz1pBQUHW559/nrtNkvXZZ5+5HTdixAi38wwaNMi6+eabc5/PmzfPKl68uPX7779blmVZ99xzj/Xwww+7nWPZsmWWn5+flZGR8bf1AAVBAngVa9WqlVwuV+7z6Oho7d69W9u3b1fRokXVsmXL3H3lypVT7dq1tWPHDknnhhkSEhJ03XXXacSIEdq8efNl1VKsWDF169ZN77//viTp9OnTmjNnTu6/ZLdv364zZ86obdu2ufNgSpUqpRkzZmjv3r2X9d5wpoYNG7o9r1ixog4fPqx169YpLS1N5cqVc/supKSkXLHvQvPmzd2enz59WkOHDlXdunVVpkwZlSpVSj/88AMJoI+6nO/ezp07de2117q9/q/PDx8+rH79+qlWrVoKDg5WcHCw0tLSPP4+9ezZU0uWLNEvv/wi6Vz62LFjR5UtW1aStG7dOk2bNs2t1vbt2ysnJ0cpKSkevRfwV8yMNohlWbkN44MPPqj27dvryy+/1Pz585WUlKSXX35ZAwcOvOTz9+zZU7GxsTp8+LAWLFiggIAAdejQQZKUk5MjSfryyy9VuXJlt9dx/0zfVKxYMbfnLpdLOTk5ysnJUcWKFbVkyZI8rzl/tbmfn1/ufNbzzk9fKIiSJUu6PX/yySc1b948vfTSS4qMjFRgYKD++c9/Kisrq8DnxNXjcr5754//X3/9Lvbp00dHjhzRhAkTdM0118jf31/R0dEef5+uvfZa1axZUx9++KEeeeQRffbZZ7lzpqVzf2727dtXgwYNyvPaatWqefRewF/RAF7FVq1aled5VFSU6tatq7Nnz2r16tWKiYmRJP3222/atWuX6tSpk3t81apV1a9fP/Xr10/Dhg3TW2+9lW8DWLx4cWVnZ1+0npiYGFWtWlWzZs3S119/rW7duql48eKSpLp168rf318HDhxwm+AM8zRt2lSpqakqWrRo7uT4v6pQoYK2bt3qtm3jxo1uf7EX9HspScuWLVOfPn105513SpLS0tK0b9++S6ofV6+CfPdq166t77//Xvfcc0/utrVr17ods2zZMr3xxhvq2LGjJOngwYM6evSo2zHFihUr0PezR48eev/991WlShX5+fnptttuc6t327ZtioyMLOhHBAqMIeCr2MGDBzVkyBDt3LlTH3zwgV599VU99thjioqKUufOnfXQQw9p+fLl2rRpk3r16qXKlSurc+fOks5dUTlv3jylpKRo/fr1+vbbb92aw/9VvXp1paWladGiRTp69KjS09PzPc7lcqlHjx6aPHmyFixYoF69euXuCwoKUlxcnB5//HFNnz5de/fu1YYNG/T6669r+vTpV/6HA8dq06aNoqOj1aVLF82bN0/79u3TihUr9Nxzz+X+RXvzzTdr7dq1mjFjhnbv3q0RI0bkaQirV6+u1atXa9++fTp69GhuypyfyMhIffrpp9q4caM2bdqkHj16XPB4+KaCfPcGDhyod955R9OnT9fu3buVkJCgzZs3u6WCkZGReu+997Rjxw6tXr1aPXv2VGBgoNt7Va9eXYsWLVJqaqqOHTv2tzX17NlT69ev15gxY/TPf/5TAQEBufueeuoprVy5UgMGDNDGjRu1e/duzZ0797JGaoDzaACvYvfee68yMjJ07bXXasCAARo4cGDuwsxTp05Vs2bNdPvttys6OlqWZemrr77KTVCys7M1YMAA1alTR7feeqtq166tN954I9/3iYmJUb9+/fTvf/9bFSpU0NixY/+2pp49e2r79u2qXLmyrrvuOrd9o0eP1vPPP6+kpCTVqVNH7du31+eff66IiIgr9BPB1cDlcumrr77SjTfeqPvvv1+1atXS3XffrX379iksLEyS1L59ew0fPlxDhw5VixYtdOrUKd17771u54mLi1ORIkVUt25dVahQ4YLzr8aPH6+yZcsqJiZGnTp1Uvv27dW0aVOvfk44T0G+ez179tSwYcMUFxenpk2bKiUlRX369HFrzN59910dO3ZMTZo00T333KNBgwYpNDTU7b1efvllLViwQFWrVlWTJk3+tqaoqCi1aNFCmzdvzp0zfV7Dhg2VnJys3bt364YbblCTJk00fPhwVaxY8Qr+VGAql/XXyQ24KrRu3VqNGzfm1lUA4GVt27ZVeHi43nvvPbtLAa4Y5gACAPD/paena/LkyWrfvr2KFCmiDz74QAsXLtSCBQvsLg24omgAAQD4/84PEyckJCgzM1O1a9fWJ598ojZt2thdGnBFMQQMAABgGC4CAQAAMAwNIAAAgGFoAAEAAAxDAwgAAGAYGkAAAADDsAwMgEK1YsUK9e/fP999t956q9auXZvnvqrnff/995o8ebLefffdfPc/99xzat68ubp06ZLv/oYNG2rGjBmXVDcA+BIaQACF6uTJk+rSpYvi4+Pdtu/bt09PP/200tLStHHjxjyva926tXJycvTLL79owoQJat26tdv+adOm6ejRozpz5owaN26sadOm5TlHq1atrtwHAYCrGEPAAAAAhqEBBAAAMAwNIAAAgGFoAAEAAAxDAwgAAGAYGkAAAADD0AACAAAYhgYQAADAMDSAAAAAhqEBBAAAMAy3ggNQqIKDg/XFF1/oiy++yLOvffv2On78uJo3b57va/38/FSlShXFxcXlu/+ZZ55RYGCgtm7dmu85GjRocHnFA4CPcFmWZdldBAAAAAoPQ8AAAACGoQEEAAAwDA0gAACAYWgAAQAADEMDCAAAYBgaQAAAAMPQAAIAABiGBhAAAMAwNIAAAACG+X93SYF21S8EgQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "特征重要性分析...\n",
      "\n",
      "最重要的20个特征：\n",
      "    feature  importance\n",
      "5        15    0.051635\n",
      "29      nan    0.051119\n",
      "425      好喝    0.049884\n",
      "104      不错    0.041097\n",
      "332     哈哈哈    0.026382\n",
      "753      爱喝    0.025669\n",
      "61      七不喝    0.025665\n",
      "420      奶茶    0.024640\n",
      "100      不能    0.020531\n",
      "113      中午    0.019339\n",
      "520      微博    0.018262\n",
      "944      赶紧    0.017789\n",
      "780      生活    0.016879\n",
      "534      快乐    0.015850\n",
      "478      小米    0.015600\n",
      "235      分享    0.014255\n",
      "418      奶绿    0.014077\n",
      "381      夏天    0.013923\n",
      "333    哈哈哈哈    0.013897\n",
      "347      喜茶    0.012491\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 37325 (\\N{CJK UNIFIED IDEOGRAPH-91CD}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 35201 (\\N{CJK UNIFIED IDEOGRAPH-8981}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 24615 (\\N{CJK UNIFIED IDEOGRAPH-6027}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 24471 (\\N{CJK UNIFIED IDEOGRAPH-5F97}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 22909 (\\N{CJK UNIFIED IDEOGRAPH-597D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 21917 (\\N{CJK UNIFIED IDEOGRAPH-559D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 38169 (\\N{CJK UNIFIED IDEOGRAPH-9519}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 21704 (\\N{CJK UNIFIED IDEOGRAPH-54C8}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 29233 (\\N{CJK UNIFIED IDEOGRAPH-7231}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 19971 (\\N{CJK UNIFIED IDEOGRAPH-4E03}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 22902 (\\N{CJK UNIFIED IDEOGRAPH-5976}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 33590 (\\N{CJK UNIFIED IDEOGRAPH-8336}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 33021 (\\N{CJK UNIFIED IDEOGRAPH-80FD}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 20013 (\\N{CJK UNIFIED IDEOGRAPH-4E2D}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 21320 (\\N{CJK UNIFIED IDEOGRAPH-5348}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 24494 (\\N{CJK UNIFIED IDEOGRAPH-5FAE}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 21338 (\\N{CJK UNIFIED IDEOGRAPH-535A}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 36214 (\\N{CJK UNIFIED IDEOGRAPH-8D76}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 32039 (\\N{CJK UNIFIED IDEOGRAPH-7D27}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 29983 (\\N{CJK UNIFIED IDEOGRAPH-751F}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 27963 (\\N{CJK UNIFIED IDEOGRAPH-6D3B}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 24555 (\\N{CJK UNIFIED IDEOGRAPH-5FEB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 20048 (\\N{CJK UNIFIED IDEOGRAPH-4E50}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 31859 (\\N{CJK UNIFIED IDEOGRAPH-7C73}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 20139 (\\N{CJK UNIFIED IDEOGRAPH-4EAB}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 32511 (\\N{CJK UNIFIED IDEOGRAPH-7EFF}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 22799 (\\N{CJK UNIFIED IDEOGRAPH-590F}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 22825 (\\N{CJK UNIFIED IDEOGRAPH-5929}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 21916 (\\N{CJK UNIFIED IDEOGRAPH-559C}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 29305 (\\N{CJK UNIFIED IDEOGRAPH-7279}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 24449 (\\N{CJK UNIFIED IDEOGRAPH-5F81}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 35789 (\\N{CJK UNIFIED IDEOGRAPH-8BCD}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 26368 (\\N{CJK UNIFIED IDEOGRAPH-6700}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\17828\\AppData\\Local\\Temp\\ipykernel_1532\\1246988625.py:96: UserWarning: Glyph 20010 (\\N{CJK UNIFIED IDEOGRAPH-4E2A}) missing from current font.\n",
      "  plt.tight_layout()\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x600 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22909 (\\N{CJK UNIFIED IDEOGRAPH-597D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21917 (\\N{CJK UNIFIED IDEOGRAPH-559D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38169 (\\N{CJK UNIFIED IDEOGRAPH-9519}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21704 (\\N{CJK UNIFIED IDEOGRAPH-54C8}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29233 (\\N{CJK UNIFIED IDEOGRAPH-7231}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19971 (\\N{CJK UNIFIED IDEOGRAPH-4E03}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22902 (\\N{CJK UNIFIED IDEOGRAPH-5976}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 33590 (\\N{CJK UNIFIED IDEOGRAPH-8336}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 33021 (\\N{CJK UNIFIED IDEOGRAPH-80FD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20013 (\\N{CJK UNIFIED IDEOGRAPH-4E2D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21320 (\\N{CJK UNIFIED IDEOGRAPH-5348}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24494 (\\N{CJK UNIFIED IDEOGRAPH-5FAE}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21338 (\\N{CJK UNIFIED IDEOGRAPH-535A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 36214 (\\N{CJK UNIFIED IDEOGRAPH-8D76}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32039 (\\N{CJK UNIFIED IDEOGRAPH-7D27}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29983 (\\N{CJK UNIFIED IDEOGRAPH-751F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 27963 (\\N{CJK UNIFIED IDEOGRAPH-6D3B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24555 (\\N{CJK UNIFIED IDEOGRAPH-5FEB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20048 (\\N{CJK UNIFIED IDEOGRAPH-4E50}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 23567 (\\N{CJK UNIFIED IDEOGRAPH-5C0F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 31859 (\\N{CJK UNIFIED IDEOGRAPH-7C73}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20139 (\\N{CJK UNIFIED IDEOGRAPH-4EAB}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32511 (\\N{CJK UNIFIED IDEOGRAPH-7EFF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22799 (\\N{CJK UNIFIED IDEOGRAPH-590F}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22825 (\\N{CJK UNIFIED IDEOGRAPH-5929}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21916 (\\N{CJK UNIFIED IDEOGRAPH-559C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29305 (\\N{CJK UNIFIED IDEOGRAPH-7279}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24449 (\\N{CJK UNIFIED IDEOGRAPH-5F81}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35789 (\\N{CJK UNIFIED IDEOGRAPH-8BCD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 26368 (\\N{CJK UNIFIED IDEOGRAPH-6700}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 37325 (\\N{CJK UNIFIED IDEOGRAPH-91CD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35201 (\\N{CJK UNIFIED IDEOGRAPH-8981}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20010 (\\N{CJK UNIFIED IDEOGRAPH-4E2A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24615 (\\N{CJK UNIFIED IDEOGRAPH-6027}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24471 (\\N{CJK UNIFIED IDEOGRAPH-5F97}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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4447TrW1tTrzzDN7PLh47733asKECaqpqdE3vvENPfzww13aq6qqtHLlSp1//vkaPny4fvSjH2nu3LmSpBEjRqiqqkqXX365JGnNmjU65ZRTVF9fr1GjRuncc8/VRx99lPusRCKhqqoqrV69WnPnztWwYcM0ffp0vfHGG12+8/XXX9e3vvUtDRs2TCNGjJDf79cXX3wh6at3091888065phjNHToUE2fPl2PP/54n/yd709FBzvDMBSJROT1ertsF110kSZMmKD6+voebV6vV+l0mpc/AgDQx26//XbNmTNH69at0znnnKPvf//7mjdvni699FK98847mjhxoubNmyfLsnLn7NixQ7/85S/14IMP6vXXX5dpmvre976Xa3/yySd11VVX6Wc/+5neffdd/fjHP9YVV1yhl19+uct3X3/99Tr//PO1YcMGLVmyRE888YQk6f3339fWrVv161//WpK0fft2LViwQH/4wx/04osvqrq6Wt/5znd6/OLHtddeq4ULFyoej+u4447T3/3d32n37t2SpHg8rtNPP10nnHCC3njjDb322ms677zzcq+tWbx4sR544AHde++9eu+993T11Vfr0ksv1SuvvNL3f+ndVFlf/9tFD6ZpyjAMpVIplmIBACWxc+dOffLJJzr66KNVW1ubO97f77Hz+XyaMWOGVqxYoaOOOkqnnnpqbjbt008/1ZgxY/SLX/xCS5YskSS9+eabamxs1NatWzV69Gi1trbqiiuu0Jtvvqm/+qu/kiT98Y9/1OTJk/XWW2/p5JNP1pw5c3TCCSfoN7/5Te57L774Ym3fvl3PPPOMpK9m7ObPn6/bb78916fQe+w+//xzHXbYYdqwYYOmTJmiRCKho48+Wr/97W/1wx/+UJK0ceNGnXDCCdq0aZMmTZqkSy65RJs3b9Zrr73W4/O2b9+uhoYGvfTSS2psbMwd/9GPfqQdO3boX//1X/PW0dv/DUjFZRGmrQAAQJ+YNm1a7s+HH364JGnq1Kk9ju39+SxJGjx4sLxeb25/0qRJqq+v16ZNmyRJmzZt0pw5c7p8z5w5c3Lte339M/blo48+0iWXXKJjjjlGbrdbRx99tCRp8+bNvV7L3p/52lv33hm7fDZu3KidO3fqzDPPVF1dXW576KGHuiz5lgoPTwAAgD7x9Sdk975wN9+x7sue+V7O+/Vj3dst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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "import jieba\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report, confusion_matrix\n",
    "import seaborn as sns\n",
    "import xgboost as xgb\n",
    "from xgboost import XGBClassifier\n",
    "\n",
    "# 1. 数据预处理\n",
    "def preprocess_text(text):\n",
    "    # 加载停用词表（需准备中文停用词文件）\n",
    "    with open('chinese_stopwords.txt', encoding='utf-8') as f:\n",
    "        stopwords = set(f.read().split())\n",
    "    \n",
    "    words = jieba.cut(text)\n",
    "    return ' '.join([word for word in words if word not in stopwords and len(word) > 1])\n",
    "\n",
    "# 加载数据\n",
    "df = pd.read_csv('final_labeled_comments.csv')\n",
    "df['processed_text'] = df['text'].astype(str).apply(preprocess_text)\n",
    "\n",
    "# 2. 文本分类（情感分析）\n",
    "# 标签编码\n",
    "label_map = {'positive': 0, 'neutral': 1, 'negative': 2}\n",
    "df['label'] = df['最终情感标签'].map(label_map)\n",
    "\n",
    "# TF-IDF向量化\n",
    "tfidf = TfidfVectorizer(max_features=2000)\n",
    "X = tfidf.fit_transform(df['processed_text'])\n",
    "y = df['label']\n",
    "\n",
    "# 拆分数据集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 3. 创建并训练XGBoost分类器（使用默认参数）\n",
    "xgb_clf = XGBClassifier(\n",
    "    objective='multi:softprob',  # 多分类问题\n",
    "    eval_metric='mlogloss',      # 多分类对数损失\n",
    "    use_label_encoder=False,     # 禁用标签编码器警告\n",
    "    random_state=42,\n",
    "    n_estimators=200,            # 适当减少树的数量\n",
    "    max_depth=5,                 # 中等深度\n",
    "    learning_rate=0.1            # 常规学习率\n",
    ")\n",
    "\n",
    "print(\"开始训练模型...\")\n",
    "xgb_clf.fit(X_train, y_train)\n",
    "print(\"模型训练完成!\")\n",
    "\n",
    "# 4. 模型评估\n",
    "print(\"\\n模型评估...\")\n",
    "y_pred = xgb_clf.predict(X_test)\n",
    "print(\"分类报告：\")\n",
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "# 5. 混淆矩阵可视化\n",
    "def plot_confusion_matrix(y_true, y_pred, classes):\n",
    "    cm = confusion_matrix(y_true, y_pred)\n",
    "    plt.figure(figsize=(8, 6))\n",
    "    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n",
    "                xticklabels=classes, yticklabels=classes)\n",
    "    plt.xlabel('预测标签')\n",
    "    plt.ylabel('真实标签')\n",
    "    plt.title('混淆矩阵')\n",
    "    plt.show()\n",
    "\n",
    "# 获取类别名称\n",
    "class_names = {0: 'positive', 1: 'neutral', 2: 'negative'}\n",
    "plot_confusion_matrix(y_test, y_pred, [class_names[i] for i in sorted(class_names.keys())])\n",
    "\n",
    "# 6. 特征重要性分析（简化版）\n",
    "print(\"\\n特征重要性分析...\")\n",
    "# 获取特征重要性\n",
    "importance = xgb_clf.feature_importances_\n",
    "feature_names = tfidf.get_feature_names_out()\n",
    "\n",
    "# 创建特征重要性DataFrame\n",
    "feature_importance = pd.DataFrame({\n",
    "    'feature': feature_names,\n",
    "    'importance': importance\n",
    "}).sort_values('importance', ascending=False)\n",
    "\n",
    "# 显示最重要的20个特征\n",
    "print(\"\\n最重要的20个特征：\")\n",
    "print(feature_importance.head(20))\n",
    "\n",
    "# 可视化最重要的20个特征\n",
    "plt.figure(figsize=(10, 6))\n",
    "feature_importance.head(20).plot(kind='barh', x='feature', y='importance', color='skyblue')\n",
    "plt.title('最重要的20个特征')\n",
    "plt.xlabel('重要性得分')\n",
    "plt.ylabel('特征词')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c41ae547-843c-4e5d-94db-bc22e09e514d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始LightGBM网格搜索...\n",
      "Fitting 5 folds for each of 19683 candidates, totalling 98415 fits\n"
     ]
    }
   ],
   "source": [
    "import lightgbm as lgb\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "# LightGBM数据集转换\n",
    "lgb_train = lgb.Dataset(X_train, y_train)\n",
    "lgb_test = lgb.Dataset(X_test, y_test, reference=lgb_train)\n",
    "\n",
    "# 定义参数网格\n",
    "param_grid = {\n",
    "    'num_leaves': [31, 63, 127],\n",
    "    'max_depth': [-1, 5, 10],\n",
    "    'learning_rate': [0.01, 0.05, 0.1],\n",
    "    'n_estimators': [100, 200, 300],\n",
    "    'min_child_samples': [20, 50, 100],\n",
    "    'subsample': [0.8, 0.9, 1.0],\n",
    "    'colsample_bytree': [0.8, 0.9, 1.0],\n",
    "    'reg_alpha': [0, 0.1, 1],\n",
    "    'reg_lambda': [0.1, 1, 10],\n",
    "    'objective': ['multiclass'],\n",
    "    'metric': ['multi_logloss'],\n",
    "    'num_class': [3]\n",
    "}\n",
    "\n",
    "# 创建LightGBM分类器\n",
    "lgb_clf = lgb.LGBMClassifier(random_state=42, n_jobs=-1)\n",
    "\n",
    "# 网格搜索\n",
    "grid_search = GridSearchCV(\n",
    "    estimator=lgb_clf,\n",
    "    param_grid=param_grid,\n",
    "    cv=5,\n",
    "    scoring='accuracy',\n",
    "    n_jobs=-1,\n",
    "    verbose=2\n",
    ")\n",
    "\n",
    "print(\"开始LightGBM网格搜索...\")\n",
    "grid_search.fit(X_train, y_train)\n",
    "print(\"网格搜索完成!\")\n",
    "\n",
    "# 输出最佳参数\n",
    "print(\"最佳参数组合: \", grid_search.best_params_)\n",
    "print(\"最佳准确率: \", grid_search.best_score_)\n",
    "\n",
    "# 评估最佳模型\n",
    "best_lgb = grid_search.best_estimator_\n",
    "y_pred_lgb = best_lgb.predict(X_test)\n",
    "print(\"\\nLightGBM分类报告：\")\n",
    "print(classification_report(y_test, y_pred_lgb))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7a3f541-e522-4d37-990f-f209b61fcd1b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import rcParams\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\n",
    "from sklearn.model_selection import train_test_split, RandomizedSearchCV\n",
    "from sklearn.metrics import classification_report, confusion_matrix, f1_score\n",
    "from sklearn.ensemble import RandomForestClassifier, VotingClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.naive_bayes import MultinomialNB\n",
    "from sklearn.pipeline import Pipeline\n",
    "import seaborn as sns\n",
    "import re\n",
    "from zhconv import convert\n",
    "\n",
    "# 设置Matplotlib支持中文字体显示\n",
    "rcParams['font.sans-serif'] = ['SimHei']\n",
    "rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# 1. 数据预处理\n",
    "def preprocess_text(text):\n",
    "    # 简繁转换\n",
    "    text = convert(text, 'zh-hans')\n",
    "    # 去除特殊字符和数字\n",
    "    text = re.sub(r'[^\\w\\s]', '', text)\n",
    "    text = re.sub(r'\\d+', '', text)\n",
    "    # 加载停用词表\n",
    "    with open('chinese_stopwords.txt', encoding='utf-8') as f:\n",
    "        stopwords = set(f.read().split())\n",
    "    # 加载自定义词典（如果有）\n",
    "    jieba.load_userdict('bubble_tea_terms.txt')\n",
    "    \n",
    "    words = jieba.cut(text)\n",
    "    return ' '.join([word for word in words if word not in stopwords and len(word) > 1])\n",
    "\n",
    "# 加载数据\n",
    "df = pd.read_csv('final_labeled_comments.csv')\n",
    "df['processed_text'] = df['text'].astype(str).apply(preprocess_text)\n",
    "\n",
    "# 2. 文本分类（情感分析）\n",
    "# 标签编码\n",
    "label_map = {'positive': 0, 'neutral': 1, 'negative': 2}\n",
    "df['label'] = df['最终情感标签'].map(label_map)\n",
    "\n",
    "# 3. 定义多个模型管道\n",
    "pipelines = [\n",
    "    ('tfidf_rf', Pipeline([\n",
    "        ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1, 3))),\n",
    "        ('rf', RandomForestClassifier(class_weight='balanced', random_state=42, n_jobs=-1))\n",
    "    ])),\n",
    "    ('tfidf_svm', Pipeline([\n",
    "        ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1, 3))),\n",
    "        ('svm', SVC(class_weight='balanced', probability=True, random_state=42))\n",
    "    ])),\n",
    "    ('tfidf_lr', Pipeline([\n",
    "        ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1, 3))),\n",
    "        ('lr', LogisticRegression(class_weight='balanced', max_iter=1000, random_state=42))\n",
    "    ])),\n",
    "    ('tfidf_nb', Pipeline([\n",
    "        ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1, 3))),\n",
    "        ('nb', MultinomialNB())\n",
    "    ]))\n",
    "]\n",
    "\n",
    "# 4. 数据集拆分\n",
    "X = df['processed_text']\n",
    "y = df['label']\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
    "\n",
    "# 5. 模型训练与评估\n",
    "results = []\n",
    "model_names = []\n",
    "f1_scores = []\n",
    "\n",
    "for name, pipeline in pipelines:\n",
    "    print(f\"\\n训练模型: {name}\")\n",
    "    \n",
    "    # 简化参数搜索以加快速度\n",
    "    if 'rf' in name:\n",
    "        param_dist = {\n",
    "            'tfidf__max_features': [5000, 10000],\n",
    "            'rf__n_estimators': [100, 200, 300],\n",
    "            'rf__max_depth': [None, 10, 20, 30],\n",
    "            'rf__min_samples_split': [2, 5, 10],\n",
    "            'rf__min_samples_leaf': [1, 2, 4],\n",
    "            'rf__max_features': ['sqrt', 'log2']\n",
    "        }\n",
    "    elif 'svm' in name:\n",
    "        param_dist = {\n",
    "            'tfidf__max_features': [5000, 10000],\n",
    "            'svm__C': [0.1, 1, 10],\n",
    "            'svm__gamma': ['scale', 'auto'],\n",
    "            'svm__kernel': ['linear', 'rbf']\n",
    "        }\n",
    "    elif 'lr' in name:\n",
    "        param_dist = {\n",
    "            'tfidf__max_features': [5000, 10000],\n",
    "            'lr__C': [0.1, 1, 10],\n",
    "            'lr__penalty': ['l1', 'l2'],\n",
    "            'lr__solver': ['liblinear', 'saga']\n",
    "        }\n",
    "    elif 'nb' in name:\n",
    "        param_dist = {\n",
    "            'tfidf__max_features': [5000, 10000],\n",
    "            'nb__alpha': [0.1, 0.5, 1.0]\n",
    "        }\n",
    "    \n",
    "    random_search = RandomizedSearchCV(\n",
    "        estimator=pipeline,\n",
    "        param_distributions=param_dist,\n",
    "        n_iter=20,\n",
    "        cv=5,\n",
    "        scoring='f1_weighted',\n",
    "        n_jobs=-1,\n",
    "        verbose=1,\n",
    "        random_state=42\n",
    "    )\n",
    "    \n",
    "    try:\n",
    "        random_search.fit(X_train, y_train)\n",
    "        \n",
    "        # 评估模型\n",
    "        y_pred = random_search.predict(X_test)\n",
    "        f1 = f1_score(y_test, y_pred, average='weighted')\n",
    "        \n",
    "        results.append({\n",
    "            'model': name,\n",
    "            'best_params': random_search.best_params_,\n",
    "            'f1_score': f1\n",
    "        })\n",
    "        \n",
    "        model_names.append(name)\n",
    "        f1_scores.append(f1)\n",
    "        \n",
    "        print(f\"{name} 最佳参数: {random_search.best_params_}\")\n",
    "        print(f\"{name} 测试集F1分数: {f1:.4f}\")\n",
    "        \n",
    "        # 生成分类报告\n",
    "        print(\"\\n分类报告:\")\n",
    "        print(classification_report(y_test, y_pred, target_names=list(label_map.keys())))\n",
    "        \n",
    "        # 生成混淆矩阵\n",
    "        cm = confusion_matrix(y_test, y_pred)\n",
    "        plt.figure(figsize=(8, 6))\n",
    "        sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n",
    "                    xticklabels=list(label_map.keys()), yticklabels=list(label_map.keys()))\n",
    "        plt.xlabel('预测标签')\n",
    "        plt.ylabel('真实标签')\n",
    "        plt.title(f'{name} 混淆矩阵')\n",
    "        plt.show()\n",
    "        \n",
    "    except Exception as e:\n",
    "        print(f\"训练 {name} 模型时出错: {e}\")\n",
    "        continue\n",
    "\n",
    "# 6. 可视化比较\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.barplot(x=f1_scores, y=model_names, palette='viridis')\n",
    "plt.title('不同模型的F1分数比较')\n",
    "plt.xlabel('加权F1分数')\n",
    "plt.ylabel('模型')\n",
    "plt.xlim(0, 1)\n",
    "plt.show()\n",
    "\n",
    "# 7. 选择最佳模型\n",
    "if results:\n",
    "    best_model_info = max(results, key=lambda x: x['f1_score'])\n",
    "    print(f\"\\n最佳模型: {best_model_info['model']}\")\n",
    "    print(f\"最佳F1分数: {best_model_info['f1_score']:.4f}\")\n",
    "    print(f\"最佳参数: {best_model_info['best_params']}\")\n",
    "else:\n",
    "    print(\"没有成功训练任何模型，请检查数据和参数设置\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "08a63653-292c-45b6-a65d-13f182869bc0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from torch_geometric.data import Data\n",
    "from torch_geometric.nn import GCNConv, global_mean_pool\n",
    "from torch_geometric.loader import DataLoader\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import jieba\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report, confusion_matrix\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from collections import Counter\n",
    "\n",
    "# 设置Matplotlib支持中文字体显示\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# 1. 数据预处理增强\n",
    "def preprocess_text(text):\n",
    "    with open('chinese_stopwords.txt', encoding='utf-8') as f:\n",
    "        stopwords = set(f.read().split())\n",
    "    \n",
    "    try:\n",
    "        text = str(text)\n",
    "        words = jieba.lcut(text)\n",
    "        return ' '.join([word for word in words \n",
    "                       if word not in stopwords \n",
    "                       and len(word) > 1\n",
    "                       and not word.isdigit()])\n",
    "    except:\n",
    "        return ''\n",
    "\n",
    "# 加载并清洗数据\n",
    "df = pd.read_csv('final_labeled_comments.csv')\n",
    "df = df.dropna(subset=['text', '最终情感标签'])\n",
    "df['processed_text'] = df['text'].astype(str).apply(preprocess_text)\n",
    "\n",
    "# 过滤空文本\n",
    "df = df[df['processed_text'] != '']\n",
    "\n",
    "# 标签编码\n",
    "label_map = {'positive': 0, 'neutral': 1, 'negative': 2}\n",
    "df['label'] = df['最终情感标签'].map(label_map)\n",
    "\n",
    "# 2. 创建词汇表\n",
    "texts = df['processed_text'].tolist()\n",
    "words = ' '.join(texts).split()\n",
    "word_counts = Counter(words)\n",
    "vocab = {'<PAD>': 0, '<UNK>': 1}\n",
    "vocab.update({word: i+2 for i, (word, _) in enumerate(word_counts.most_common(10000))})\n",
    "\n",
    "# 3. 创建图数据\n",
    "def create_graph_data(texts, labels, vocab, max_len=128):\n",
    "    data_list = []\n",
    "    for text, label in zip(texts, labels):\n",
    "        words = text.split()[:max_len]\n",
    "        if not words:  # 跳过空文本\n",
    "            continue\n",
    "        indices = [vocab.get(word, vocab['<UNK>']) for word in words]\n",
    "        \n",
    "        # 节点特征\n",
    "        x = torch.tensor(indices, dtype=torch.long).unsqueeze(1)\n",
    "        \n",
    "        # 边连接\n",
    "        num_nodes = len(indices)\n",
    "        if num_nodes < 2:\n",
    "            edge_index = torch.empty((2, 0), dtype=torch.long)\n",
    "        else:\n",
    "            edge_index = torch.tensor(\n",
    "                [[i, i+1] for i in range(num_nodes-1)] + \n",
    "                [[i+1, i] for i in range(num_nodes-1)],\n",
    "                dtype=torch.long\n",
    "            ).t().contiguous()\n",
    "        \n",
    "        data = Data(\n",
    "            x=x,\n",
    "            edge_index=edge_index,\n",
    "            y=torch.tensor([label], dtype=torch.long),\n",
    "            num_nodes=num_nodes\n",
    "        )\n",
    "        data_list.append(data)\n",
    "    return data_list\n",
    "\n",
    "# 划分数据集\n",
    "train_texts, val_texts, train_labels, val_labels = train_test_split(\n",
    "    df['processed_text'], df['label'], \n",
    "    test_size=0.2, \n",
    "    random_state=42, \n",
    "    stratify=df['label']\n",
    ")\n",
    "\n",
    "# 创建图数据集\n",
    "train_data = create_graph_data(train_texts.tolist(), train_labels.tolist(), vocab)\n",
    "val_data = create_graph_data(val_texts.tolist(), val_labels.tolist(), vocab)\n",
    "\n",
    "# 4. 定义GCN模型\n",
    "class GCN(nn.Module):\n",
    "    def __init__(self, vocab_size, embedding_dim=128, hidden_dim=256, output_dim=3):\n",
    "        super().__init__()\n",
    "        self.embedding = nn.Embedding(vocab_size, embedding_dim)\n",
    "        self.conv1 = GCNConv(embedding_dim, hidden_dim)\n",
    "        self.conv2 = GCNConv(hidden_dim, hidden_dim)\n",
    "        self.classifier = nn.Linear(hidden_dim, output_dim)\n",
    "    \n",
    "    def forward(self, x, edge_index, batch=None):\n",
    "        x = self.embedding(x.squeeze())\n",
    "        x = self.conv1(x, edge_index)\n",
    "        x = F.relu(x)\n",
    "        x = F.dropout(x, p=0.5, training=self.training)\n",
    "        x = self.conv2(x, edge_index)\n",
    "        x = global_mean_pool(x, batch)\n",
    "        x = self.classifier(x)\n",
    "        return F.log_softmax(x, dim=1)\n",
    "\n",
    "# 初始化模型\n",
    "VOCAB_SIZE = len(vocab)\n",
    "model = GCN(vocab_size=VOCAB_SIZE, \n",
    "           embedding_dim=128,\n",
    "           hidden_dim=256,\n",
    "           output_dim=3)\n",
    "\n",
    "# 5. 数据加载器（添加drop_last=True）\n",
    "BATCH_SIZE = 32\n",
    "train_loader = DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True, drop_last=True)\n",
    "val_loader = DataLoader(val_data, batch_size=BATCH_SIZE, drop_last=True)\n",
    "\n",
    "# 6. 训练配置\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "model = model.to(device)\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4)\n",
    "criterion = nn.NLLLoss()\n",
    "\n",
    "# 7. 训练函数\n",
    "def train():\n",
    "    model.train()\n",
    "    total_loss = 0\n",
    "    for batch in train_loader:\n",
    "        batch = batch.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        out = model(batch.x, batch.edge_index, batch.batch)\n",
    "        loss = criterion(out, batch.y.squeeze().long())\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        total_loss += loss.item()\n",
    "    return total_loss / len(train_loader)\n",
    "\n",
    "# 8. 评估函数\n",
    "def evaluate(loader):\n",
    "    model.eval()\n",
    "    total_loss = 0\n",
    "    correct = 0\n",
    "    with torch.no_grad():\n",
    "        for batch in loader:\n",
    "            batch = batch.to(device)\n",
    "            out = model(batch.x, batch.edge_index, batch.batch)\n",
    "            loss = criterion(out, batch.y.squeeze().long())\n",
    "            total_loss += loss.item()\n",
    "            pred = out.argmax(dim=1)\n",
    "            correct += (pred == batch.y.squeeze().long()).sum().item()\n",
    "    return total_loss/len(loader), correct/len(loader.dataset)\n",
    "\n",
    "# 9. 训练循环\n",
    "N_EPOCHS = 200\n",
    "best_val_acc = 0\n",
    "for epoch in range(1, N_EPOCHS+1):\n",
    "    train_loss = train()\n",
    "    val_loss, val_acc = evaluate(val_loader)\n",
    "    \n",
    "    if val_acc > best_val_acc:\n",
    "        best_val_acc = val_acc\n",
    "        torch.save(model.state_dict(), 'best_gcn_model.pt')\n",
    "    \n",
    "    print(f'Epoch {epoch:02}')\n",
    "    print(f'\\tTrain Loss: {train_loss:.3f}')\n",
    "    print(f'\\t Val. Loss: {val_loss:.3f} | Val. Acc: {val_acc*100:.2f}%')\n",
    "    print('-'*50)\n",
    "\n",
    "# 10. 最终评估\n",
    "model.load_state_dict(torch.load('best_gcn_model.pt'))\n",
    "_, test_acc = evaluate(val_loader)\n",
    "print(f'Final Test Accuracy: {test_acc*100:.2f}%')\n",
    "\n",
    "# 生成分类报告\n",
    "all_preds = []\n",
    "all_labels = []\n",
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    for batch in val_loader:\n",
    "        batch = batch.to(device)\n",
    "        out = model(batch.x, batch.edge_index, batch.batch)\n",
    "        preds = out.argmax(dim=1).cpu().numpy()\n",
    "        all_preds.extend(preds)\n",
    "        all_labels.extend(batch.y.squeeze().cpu().numpy())\n",
    "\n",
    "print(\"\\nGCN模型分类报告：\")\n",
    "print(classification_report(all_labels, all_preds, target_names=label_map.keys()))\n",
    "\n",
    "# 混淆矩阵可视化\n",
    "def plot_confusion_matrix(y_true, y_pred, classes,save_path='confusion_matrix.png'):\n",
    "    cm = confusion_matrix(y_true, y_pred)\n",
    "    plt.figure(figsize=(8, 6))\n",
    "    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n",
    "                xticklabels=classes, yticklabels=classes)\n",
    "    plt.xlabel('预测标签')\n",
    "    plt.ylabel('真实标签')\n",
    "    plt.title('混淆矩阵')\n",
    "    plt.savefig(save_path)  # 保存图片plt.savefig(save_path)  # 保存图片\n",
    "    plt.show()\n",
    "\n",
    "plot_confusion_matrix(all_labels, all_preds, list(label_map.keys()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "bf8ee61e-f42f-4206-b51f-cbcaecc29f56",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始训练模型...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\17828\\AppData\\Roaming\\Python\\Python312\\site-packages\\xgboost\\training.py:183: UserWarning: [19:32:01] WARNING: C:\\actions-runner\\_work\\xgboost\\xgboost\\src\\learner.cc:738: \n",
      "Parameters: { \"use_label_encoder\" } are not used.\n",
      "\n",
      "  bst.update(dtrain, iteration=i, fobj=obj)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型训练完成!\n",
      "\n",
      "模型评估...\n",
      "分类报告：\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.81      0.63      0.71        79\n",
      "           1       0.57      0.88      0.69        67\n",
      "           2       0.50      0.14      0.22        28\n",
      "\n",
      "    accuracy                           0.65       174\n",
      "   macro avg       0.62      0.55      0.54       174\n",
      "weighted avg       0.67      0.65      0.62       174\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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rVunxMREffbZZ+revbt27dqlhIQEXbp0ScOGDVP//v116dIlJSYmOmowDENRUVEaO3asKleurAsXLmj37t165plntGXLFnl7eys0NFRDhw7Vhg0bFBcXlwvvFACYg0YPwG2rV6+ejhw5ouXLl6ty5cpasmSJgoODVb58eccxKSkpqlSpktN59913n4YMGSKbzabMzExdunRJxYoVk6S/XU5l5syZqlSpkp555hlt27ZNmzZt0rJly5way8OHDzumiiVp2rRpatCggc6cOaP+/ftr4cKFuv/++1W8eHEFBgZq3LhxCg4O1kMPPaQZM2boxRdfFIsRALAKrtEDcNeULl1ay5YtU1JSkiQpISFB3t7eKliwoCTnJu65555Tnz59dP36dR09elRlypSRJKWmpt50/bwVK1Zo165d6t27tyRp4cKFeuCBB1SpUiXHtYGStGTJEkVERCg6Olq+vr4aOHCgevXqJT8/P6WmpmrMmDE6efKkYmJi1LRpU0nSRx99pEcffVSdO3fOvTcHAExAogfgrilSpIhCQkIcd8Lu3LlTwcHBjp+npKRIkqKiorRv3z61a9dOBw8e1OrVq1W3bl21aNFCERERSk9Pd1zv94eIiAj9+9//dqyZ17RpU61fv16lS5dW69atHce9/vrr8vHx0YQJEyRJXl5e8vPz08WLFxUSEqK0tDSdPXtWw4cPl3TjRpBBgwYpLS0t994YADAJjR6Au6527dp67733FBERoVatWmnJkiV69dVX1bdvX0nSxIkTNWjQIPn5+cnHx0dfffWVChcurEceeURXr17Vs88+qylTpjiNuWTJEj355JOO1+np6Ro7dqwGDx7sWENPkjw9PTV69GjNmTNHCQkJjv0lS5ZUSEiIvvnmG9WvX1+HDh1SUlKSvv76a7Vr1y7L9DIAWAGNHoA7kpCQoFOnTjmtP+fn56clS5Zo9+7dGjRokL799lt17NhRqampWr16tZYvX65BgwZJkoYOHao2bdpo0KBBeuyxx9SjRw/5+/urTJkyjgRQkmP8tLQ0ZWRkKCUlRV26dNHzzz+vpUuXasuWLY4bOjp27Kjo6Gj5+flJ+u+U8ejRo1WjRg25u7vrhx9+kLe3tz755BP17NlT0o3mEQCshGv0ANyRd999V/PmzXNMhf7666/q2bOnSpUqpa1btyogIEDz58/Xhx9+qAYNGmjevHkaNWqUihUrpvnz5+uHH37Qr7/+KunGI8+6d++uhIQETZs2TZMmTdLkyZOd/j673a60tDQVKlRII0eOlCRNnjxZ/v7+6tKli6QbTWFQUJDjHC8vLxUqVOimiyGnpKSoU6dOstvtstvtunTp0i2XegGA/IJn3QK4qzIzM7V9+3Y1bNgwy89Onz6tsmXLOl4bhqFz584pMDAwy7GxsbGy2+1Od/ACAHKGRg8AAMCiuEYPAADAomj0AAAALIpGDwAAwKJo9AAAACyKRg8AAMCiaPQAAAAsikYPAADAomj0AAAALOr/ASv8ZfWwzD24AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "特征重要性分析...\n",
      "\n",
      "最重要的20个特征：\n",
      "    feature  importance\n",
      "425      好喝    0.049884\n",
      "104      不错    0.041097\n",
      "332     哈哈哈    0.026382\n",
      "753      爱喝    0.025669\n",
      "61      七不喝    0.025665\n",
      "420      奶茶    0.024640\n",
      "100      不能    0.020531\n",
      "113      中午    0.019339\n",
      "520      微博    0.018262\n",
      "944      赶紧    0.017789\n",
      "780      生活    0.016879\n",
      "534      快乐    0.015850\n",
      "478      小米    0.015600\n",
      "235      分享    0.014255\n",
      "418      奶绿    0.014077\n",
      "381      夏天    0.013923\n",
      "333    哈哈哈哈    0.013897\n",
      "347      喜茶    0.012491\n",
      "673      果茶    0.011740\n",
      "444      学到    0.011467\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x600 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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ZAjdunXjnnvuYf369fnYKxERkX+P8uXLc/r06fxuBm3atGH69On53Yw84xcjdnB+8b9/crlcWZY1m80sX76cTp06YbfbiYyMpGbNmmzevJlq1arRvn174Py08y1btrBu3ToeeuihHLdpUP1ihIWF5bieiIjIv01AQABFihTJ72YUeH4xYvdPCQkJ3HHHHQwcOJBSpUplWaZZs2Z89dVXHD16lMTERFatWsVHH33E4MGDvcEuPT2dbt26ERoayn333Xc9uyAiIvKvEhsb6/Oce5s2bXjiiSeIioqiV69ePPXUUxQpUoSFCxcyffp0mjZtyn333Ud4eDgdOnTwWY1i586dtG7dmvDwcDp27MiRI0e8+3r16sWIESOYOXMm1atX5/333wegf//+mEwmfv31V5544glMJhP9+/f31lu9ejUNGjQgODiYJk2asHPnTgBWrlxJdHQ033//PRUqVCAiIoKJEyd6623ZsoUWLVoQEhJCq1at+PPPP737Nm7cSLNmzQgPD6dLly6kpKTk/g/7D34Z7EqUKMETTzzBpEmT+Oqrr7IsU7hwYTp37kyZMmUueZyKFSuSmprKihUrqFatWl41V0REpEDav38/kyZNYsaMGdStW5e7776bBQsWAOdDUYsWLdi6dStWq9Ubws6ePUv79u2544472L59O1FRUdx33314PB7vcX/++Wc++OADxo0bR+fOnQEYP348p0+fplWrVkyePJnTp08zfvx44Pz75Lt27cqDDz7IgQMHaNmyJS+++KL3eCdPnmTMmDH8+OOPjBw5khdffJH09HRSU1Pp0KED9957L3v27KF58+Y8+uijACQnJ3PXXXfRqVMnduzYQVpaGoMHD87z39RvbsX+0yOPPJIrx9G0cxERkavzyCOP0KBBAwCefPJJTp48SWxsLADlypXj5ZdfxmQyMWLECJo0aYLL5eKHH34gNDSU4cOHAzBx4kSKFy/Ohg0baN68OQAHDhxg7969Pu9xL1SoEIUKFcJisRAcHJzptvC2bdsIDw9n+/btnDlzhr1793r3nT17lg8//JA6depQrVo1nnvuORISEvjtt98oWrQoMTExALzyyis0bdoUgIULFxIYGMirr76KyWTihRde4PHHH8+Ln9GH3wY7ERERyV82my3Lv+F8sLsweFK2bFncbjcnT54kLi6OihUrestZrVbKlClD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VLjmMJaThyBFRETEv2nyxCXYbLZreltE3bp1c7E1IiIiIrnLr56xExERESnIFOxERERECggFOxEREZECQsFOREREpIC4IYPd4MGDmTVrVo7q9OrVi59//jlHddLS0ujevTsbN27MUb2DBw/So0cP9u3bl6N6IiIiInnphgt26enpTJ48mTlz5mS7zv79+5kxYwaLFy/O0bl+//13vv76a9auXZujesuXL+eLL77gzz//zFE9ERERkbyUb+vYDRs2jG+++QaAEiVKeMPVggULGD9+PKdPn2bRokWUKVPGW6dnz5789ttvANx0003e+u+99x7r1q1j8+bNbNu2jUKFCvmcq127dhw6dAiAe+65h/HjxwPwwgsvcO7cOTZs2MCWLVswmUw+9WrUqIHL5QLg6aefZvDgwQDcf//9lC5dmkOHDvHjjz/muO8X1qMZvuoAtpDQHNcX/zO0YWR+N0FERPJJTtaxy7cRu+TkZIYMGcLSpUuJi4vzbp8xYwbdu3enX79+DBgwwKdOYmIi77//PlOnTuXYsWM+dXr27Ennzp2JiYnJdK5jx46xcOFCXnnlFZKSkgBwOp3MmjWLQYMGUa1aNd57771M9Q4fPszOnTt57LHHSE5OBs6/I3bZsmWMHj2axMRE5s+fnwu/hoiIiMi1y7cFii2W/53abDYDsGXLFpYvX8706dMpVKgQU6dO5fnnn2f8+PGYTKYs68yfP5/k5GTat29P8+bNqVevHlFRUd7RtUuda/LkydSsWZMaNWrw9ttv07hxY0qVKkX37t0vW++NN96gS5cuhIeHM2nSJO666y6KFClCmzZtcvHXEREREcm5fBuxu/i2p9lsxm63079/f5588klCQ0MJDAxkypQpTJo0iTZt2nDs2LFMdU6dOsWgQYMYPHgwAQEBFClShHHjxjFkyBC6dOnC2bNnszzXgQMHGDVqFEOGDAGgYsWKDBs2jEceeYR+/frhdruzrLdhwwamTJnCoEGDAGjWrBmPPvoo7du3Z8SIEXn2W4mIiIhkR76N2F0cmkwmE88++ywlSpRgzZo1REZGYjKZcDqdTJo0iV27dlGyZEmfOoZh0L17d9q3b88777zD8OHDAXA4HEyfPp0DBw4QEhKS6Vzp6encd999DBw4kG7duhEcHAycH537+OOPcTqd3tG5i+slJibywAMP8OKLL9KyZUvvq8kqVqzIq6++Sv369S/ZV4fDgcPh8H5PTU296t9NRERE5FLyLdh5PB7v3263mw8++IDjx49z4MABn3KhoaHeZ+0urmMYBvPmzSMhIcHn9ilA8eLF6dmzZ5bnslqtrF27lvj4eG677TafelFRUVSuXDnLesWKFWPXrl0cOHCAdu3a+dSrWrUqZcuWvWRfR48ezciRIy+5X0RERCQ35FuwMwyDIUOGMGzYMEJCQggKCmL16tWMHTuWRx99FDg/eWHDhg2sW7fOW+ehhx4CoH79+hQuXJhZs2axbNkyOnbsCMDWrVtxuVzMnj3b51wtWrTA5XJx//33ExoaytixYzl9+jTNmzcHYMWKFdStW5cxY8b41CtXrhxpaWkMGTKE0NBQhgwZQnR0NNWrVwfg22+/pWfPnvTv3/+SfY2JifHevoXzI3ZRUVG58TOKiIiIeOVbsHO5XIwdO5YOHTrQqlUrAAIDA6levbr32bd169axbds2nzpff/01NpuN//73v946TZs29daZPXs2ixYtynSu33//nXXr1rFkyRJvvdtvv90byFwuF+np6ZnqJSYmMmbMGJxOp7feAw88QIcOHQDYt28fVqv1sn21Wq1XLCMiIiJyrfIt2GVkZADnb39u2rQJINM6cpeq06JFC+8yI1eqc3G9bt26ce+99+a43sWjbdmpJyIiIpIf8i3YjR49GpvNhtlspnTp0sD5W58//vgjVapUAc5POihXrpy3zueff05ERARWq5XixYt763z00UfMnTsXgLNnz2Z6dm758uWUKVOGwMBA72QJwzB47bXXGDt2LHB+Xb0nn3zSp96ePXuwWq3eiRIX6vXu3dt7nMTERBo2bJhrv4uIiIjI1cq3YFeiRIlM2zIyMujUqZP3+bh169bxzDPPePdnNUEhIyODfv36eZ+Nmz17dqbXkVWoUCHLeqNGjfLeih0zZgyJiYk+ZS4EzH/W+/TTT723Yvv37+8d2cupQfWLXXEFaREREZHsyrdXivmznLwaRERERPzbv+KVYiIiIiKSuxTsRERERAoIBTsRERGRAkLBTkRERKSAULATERERKSAU7EREREQKCAU7ERERkQLCL4KdYRjY7XY8Hs8Vy7pcLux2u/e73W7H7XZfsrzT6fS+R1ZEREQkP+XbmyeupxMnTtC6dWtsNhsWy/+6vGPHDipVqkThwoW92zIy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Jk2aEBwcTHp6OgcPHqRy5crecidPnqRIkSKcOXOGKVOmkJCQwMyZM0lOTqZu3brExMTw5Zdf8sknn3Dw4EEefPBBFixYQJcuXfKxdyIiIiJ+dCs2ODiYzz//nPLly7N3714OHDjAxo0bady4sc+Cw0lJSURERBAWFkZSUpJ3+/Hjx/F4PDidTqZNm8Ydd9xB/fr1+fTTTzl27Jh3BFBEREQkv/hNsAMYMWIErVq1omnTpgwbNox9+/YxcOBAnzIJCQkUL16cY8eOMWfOHDZv3syGDRto164d69atw2KxsHLlSt59911CQ0OZMWMGd999N7179+btt9/2CYlXMqh+Md2WFRERkVzjF7dinU4nr776KosXL+bTTz/lpZdeIjo6mvT0dO8kiu3bt/POO+/w9ttvU716daxWK3/88QcPPfQQ27dv5/3332f06NGsWrWKffv2sWLFCqxWK7fccguLFy/GMIwchToRERGR3OY3I3YlS5Zk2bJlhIWF4XK5cLlczJo1i6CgIAAiIiJYtWoVN998M88//zxFixZl+vTpPse44447gPPr3VWvXp3OnTsD0LJlS1q2bHk9uyMiIiKSickwDCO/G+FvcvIyXxEREfFvOckNfnErVkRERMQfKNiJiIiIFBAKdiIiIiIFhIKdiIiISAHh98HOMAyOHj2a7fJLly4lNjY27xokIiIicpX8ZrmTi7355pucPn2asWPHsnbtWrp27UpsbGymdejOnTtHYGCgd0kUgAkTJlC3bl1Gjx7t3eZwODCZTD7lsmPctpPYQjKurTPid4Y2jMzvJoiIyA3K70bszp07x/jx473rzrVq1YqaNWsycuTITGXbtGlDlSpVfD67d+9mzpw5PtsqV67MuHHjrndXRERERHz43YjdyJEjqV69Ol26dPFuGz9+PM2bN6dFixbcc8893u0bN27MjyaKiIiIXBW/Cna///47kyZN4rfffvPZXr9+fd599126du3KjBkz6N69u3ff4cOHqVKlCvXq1ct0vJSUFKpVq8aPP/6Y520XERERuRK/CXaxsbE88MADvPLKKzRo0CDT/gEDBhAYGMjjjz/O3Llz+eCDDyhRogSBgYGEhYXxyiuvZKqzadMmdu7cecVzOxwOHA6H93tqauo19UVEREQkK37xjJ3b7eaee+7h9ttvZ8mSJZjNZkwmU6bP2LFjWbZsGUlJSQQHBwMQFhbGlClTvO+XvfjToEEDhgwZcsXzjx49mvDwcO8nKioqr7ssIiIifshv3hUbGxtLuXLlsNvtBAQE0KpVK1566SXuv/9+AD777DO+/fZbli5d6lMvKioKk8lEQIBvBvZ4PKSlpQHwzDPPZDn54oKsRuyioqIYvuoAtpDQ3Oqi+AnNihUR8S85eVes39yKjY6OBiAkJASHw8GePXto3LgxNpsNgMTERMqVK5epXlxcXKZta9as4emnnyYoKIjnn3+eBx988LLntlqtmZZSEREREcltfnEr9p/mz59PdHQ0VatW9W6Lj4/3CXZOpxOn05mp7kcffUSnTp3o3bs3u3fv5tlnn6V48eKkpaXhdruvS/tFREREsuI3I3YXHD58mCFDhjB27Fif7fHx8TRs2ND7/YsvvmDkyJEEBgb6lDt16hQBAQFMnjyZyZMnA+ffXpGRkcH8+fNp1KhR3ndCREREJAt+84wdwIoVK3jsscfo2rUr7733HgB79uwhNjaW7t27s2DBAm655ZbLHuO1114jIyODMWPGXHU7cnKvXERERPxbTnKD39yK/eKLL7j33nsZMmSIN9QBrFy5khdeeIEBAwbQunXryx5jxYoVbNq0CYvF7wY6RURE5F/Ar0bsEhMTKV68+FXXf+211zh06BDDhw+nUqVKV30cjdiJiIhIduUkN/hVsLtRKNiJiIhIdulWrIiIiIgfUrATERERKSAU7EREREQKCAU7ERERkQJCwU5ERESkgPDrYNenTx9eeumly5ZxuVykp6d7vzds2JAPPvjA+/2vv/7C4/HkWRtFREREssuvV9q12WyZXhn2T4888giRkZHeMFe6dGmCgoKA89OPb775Zl566aUrBsSsjNt2EltIRs4bLnIVhjaMzO8miIhIHvPrEbvAwEBMJtNly/z3v/9l6tSprFixAsAb6gCGDRtGlSpVGDRoUJ62U0RERCQ7/C7Yffzxx8TGxmbavnz5crZt25Zpe/369RkwYADr1q3z2Z6SksLatWuZPn26XjEmIiIiNwS/SiRJSUk8/fTTrFmzhujoaJ99CxYsYOfOnSxbtgw4/2ydyWTCbDYzYcKETMcKDw/njz/+AMDtduN0OrHZbHndBREREZFL8qsRu3nz5lGlShVatGiRad+rr77Kxo0bWbp0KQBvvvkmYWFhREZGej8BAQEsWLCAJ5980mdfeHg4wcHB2O32LM/rcDhITU31+YiIiIjkNr8KdjNmzKBnz55Z7ouMjGTw4MG89tprALz22mucO3eOpKQkkpKSWLhwIcWLF6ddu3bceuutNGnShBMnTpCUlMTZs2dxuVyXHLEbPXo04eHh3k9UVFSe9VFERET8l98Eu23btrFu3bpLBjuAZ555hj/++INVq1b5TKo4d+4cTz/9NIMGDSIkJITHHnuM8PBwevfujcvlAiAg4NI/ZUxMDCkpKd5PXFxc7nVMRERE5P/zm2A3YsQI7r77bsqWLXvJMpGRkTz00EOsWrXKu+3kyZN07tyZ4OBgBg8e7N0+c+ZMDhw4QKtWrVizZs1lz221WgkLC/P5iIiIiOQ2v5k88dZbb2Wr3CeffEJQUBCnT5/m008/ZezYsdSoUYMffvjBZ/ZrcHAwS5cuZfjw4bRt25Y6derw+++/Y7Va86oLIiIiIpflN8GuZs2ambY5nc5M69hdWKfOYrHw448/MmLECJ588knvrVbDMLxlrVYrY8aMoX///vzxxx85DnWD6hfT6J2IiIjkGr8Jdhc7ePAg3bp1Y9euXXzyySdZlgkNDWX58uWZttvtdhwOh8+26OjoTMuniIiIiFxvfhnsKlasSL9+/ahRowatW7fOUd2ff/45j1olIiIicm38MtgB9O3bN7+bICIiIpKr/GZWrIiIiEhBp2AnIiIiUkAo2ImIiIgUEAp2IiIiIgWEXwU7u91Oenq6zza3243T6cynFomIiIjkHr+aFft///d/nD59mnHjxnm3rVu3jgcffJD4+Pgs6xiG4Q2EJ0+e5MiRIxw+fJg9e/awfft2NmzYwPz582nZsuX16oaIiIhIlvwq2FmtVu+bJS4oVKgQxYoVu2Sdvn378vXXX1O6dGkiIyMpUaIEJUuWpHTp0tx7770MGDCAcuXKXVV7xm07iS0k46rqilytoQ0j87sJIiKSR/wm2M2dO5f09HROnDhBnz59aNCgAe+++y5ms5njx4/ToEEDMjIyuPPOOxk/fry3Xnx8PG+88QbPP/88cP5dst988w0ff/xxPvVEREREJGt+84xdjx49cDqdlCxZkt9++43bb7+d2NhYvv32W+rWrcvWrVt56aWXSE1N9al36NAhKlWq5LMtI0OjbCIiInLj8Ytgd+zYMQoXLkyRIkUAeOCBB5gzZ06WZU0mk/fvEydOsG/fPqpVq+az/+IyAA6HA7vdnvsNFxEREckBv7gVu337durUqeP9/sILL1C4cOEr1ps+fTpOp5PatWsTGBgInJ9F63a7sdls3nJOp5OHH36YmTNnZnkch8OBw+Hwfv/nqKCIiIhIbvCLYFekSBGefvppDh8+DMCZM2do0KABhQsXxuVycfToUerWrUtaWhpnzpyhQoUKrFmzhmeeeYaHH36YcuXKcebMGcLDw5k6dSozZ85k5cqVPudwu92XPP/o0aMZOXJkXnZRRERExD9uxTZr1oxu3bp5v1esWJEjR46wZ88eHnvsMRo3bkzdunXZv38/CQkJHDp0iKioKEJCQihfvjwTJ06kTZs2uFwun+P26dOH1atXA2A2my95/piYGFJSUryfuLi4vOmoiIiI+DW/CHaXkpKSwmeffcbs2bNJSkri22+/zVTml19+4ZVXXmHMmDFYLL4DnHXr1uXOO+/kp59+uux5rFYrYWFhPh8RERGR3OYXt2IvMAwDwzCA87dOn3jiCZ544gnKlSvHxx9/zC233EJkZCS33norAN9//z2PPPIIX3zxBXfeeWem4z3//PM4nU7uv/9+5syZw7333ntd+yMiIiJyMb8asXM6nbhcLhITE+ncuTMBAQG89tprAERHR/P555/TuXNnJk+ejGEYfPXVV3zwwQfcf//93mOcOnWKgID//WwvvvgiL774YqbbtCIiIiLXm8m4MITlB0aNGsXJkyex2WycO3eOCRMmZLq9um7dOoYOHco333xDiRIlvNvXr19PmzZtsNvtvPnmmwwbNuyq25Gamkp4eDgpKSm6LSsiIiKXlZPc4FfB7loYhsHGjRupWrUqERER13QsBTsRERHJrpzkBr96xu5amEwmmjZtmt/NEBEREbkkv3rGTkRERKQgU7ATERERKSAU7EREREQKiGw9Y9elSxesVismk+my5cxmMx07duThhx/OlcaJiIiISPZlK9itXbuWt99++4rlEhMT6dOnD7fddhulSpW65saJiIiISPZlK9iFhobSs2dP7HY7MTExjB8//pJl586dy8GDB2/IYHfgwAEsFgvly5cHoGvXrlSuXPmSofXw4cNMmDCBN954g+DgYJ99aWlp/PXXX2zcuJHdu3fz7rvvXvZ9sSIiIiJ5LVvB7sItWKvVyvz58xk/fjwdO3b0Lu6b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UBYsWMDYsWP54YcfqFy5MitWrKBhw4Y3fKiD87N4U1JSOHDgAFarlVOnTnHs2LHL1jEMg6xepVuxYkVOnTrF559/zoMPPqi3bYiIiMgNIdvBbsSIEQQFBdGpUycGDx4MQIUKFXjxxRfzrHG5acmSJXz99dcsWLAAj8fDnDlz+Prrr7Hb7bjdbm+5C7doPR4PaWlpOBwOMjIycLvdxMfH06xZM/r378+7777LnDlzmDZtGlWqVOGtt9665LkdDgepqak+HxEREZHclu0FimfOnMmIESOA87co3377bQzDwOFweEONyWSiffv2NGrUKE8aey127drF4cOHMZvNlCpViq+//pro6Gg+/PBD/vjjD2+gK1asGC6Xi02bNvHf//4XgNTUVJ577jmeeOIJZs6cSdmyZRk9ejTr169n48aN7Ny5M9O7dC82evRo3a4VERGRPJftEbt/BheXy4XL5cJkMuF0OnE6nZw6dYrHHnss1xuZGx577DGKFi3KiBEjqFSpEn369PHO8k1NTeXzzz+nWbNmnDp1itTUVKpVqwbAoEGDKFmyJCNHjuTEiRPcd9991KpVC5PJxMSJEzGZTDRu3JibbrrpkueOiYkhJSXF+9Gr2ERERCQvmIysHiL7h9atW7NlyxaaNWuGYRisX7+etLQ04PwrxBISErxlS5QowYkTJzIthZLfNmzYwD333MPx48e57bbbWLVqFYZhMGfOHLp27cq8efN49913fSZPAOzdu5eTJ0+ydu1a5s+fz2233cbzzz9P0aJFGTp0KDt27GDevHk5es4wNTWV8PBwhq86gC0kNLe7KnJdabkTEZG8dSE3pKSkEBYWdtmy2boVO2rUKHr16sWYMWPweDw88MADmcqsXr2aYsWKERcXd8OFOoAdO3aQmprK/v37Afjpp5+4/fbbvSORbrc709p2sbGx9OvXjw0bNmC322ndujWrV6/mp59+4ty5cxiGQXJyMr179+aLL764IfstIiIi/iNbt2Lbtm1LUFAQjRo1onnz5j6zQN1uN6tWraJHjx4kJCTcsG9lWLp0KXXr1uWee+4hKSkJAIvF4g12TqcTl8vlUycqKor777+fd955hyeffJJp06YRGRlJ586dWbBgAbfccgvr16+nQoUKZGRooWERERHJX9mePNGzZ088Hg9ms5m0tDTS09Mxm81UqVKFli1bsmfPnht22ZOjR4+yYMECtm3bxk8//cRLL73EF198gcPhoFatWkRERHDTTTfxyiuvkJiYyOnTp4mMjCQ0NBSXy8Xbb7/Niy++SKVKlQgODsZisVCuXDmsVis333wzU6dOvapAO6h+sSsOqYqIiIhkV7aD3auvvgrA448/zpEjRwgKCuKtt97izTffxGLJ9mHyxZ9//knbtm2pWrUqzz33HF27dmX69OlMnDiRPXv2kJiY6DPiZjKZOHHiBM8//zxxcXFs3LiRjIwMHn/8cX755Rfatm1LcHAwkyZNol27djzyyCOsW7eOKlWq5GMvRURExN9la/LEggULKFKkCAAdO3bkxx9/JCAggJ9++omNGzcyfPhwAO/yJ+3bt8/TRl8Nj8dz2SVJnE4nbrebgIAAAgMDvbN9L9x2NgyDCRMm0KBBA2677TafuufOnaNw4cLZbktOHoIUERER/5aT3JCtYHfLLbd4g8uyZcto166dd9+6deuoXbs2oaGhGIZBeno6v/766zV2oWBTsBMREZHsyvVZsatWrWLt2rXYbDbWrVvHokWLvPsGDx5MlSpVePrpp6+t1SIiIiJyTbK9QPGKFSvo0aMH586do23btnzyyScAPPDAA3zzzTd51kARERERyZ5s3Yq9mN1uZ+PGjVgsFlq0aIHT6SQxMZEyZcrkVRsLHN2KFRERkezK9VuxF7PZbNx8883e74GBgQp1IiIiIjeAbN+KLQjcbvcl96Wnp+NwOHJ8zH8uaiwiIiKSX27sBehy2aBBg6hduzZ9+vThr7/+IiYmhu+//x6AxYsX895777Fy5Upv+QMHDnDHHXd4X0N2wdSpU1m4cCHz5s2je/fuDB8+nLp16+a4PeO2ncQWojdWSMGid8eKiOQfvwl206dPZ9WqVbz11ltER0fzzTffEBgYyNtvv01UVBSHDx/2WcYFwGq1ekfkBgwYwJw5cwgLC+Ps2bOkpaVRtWpVAO655x5uvvlmvvjii+veLxEREZEL/CLYHT9+nLFjx7J48WL279+PzWYjODiYgIAArFYrQUFB/P7775QvX56pU6fidDp55JFHMJvNmEwmACZPnsy4ceMA+OKLL1iyZAmff/45AAEBATfs69RERETEf/jFM3alSpVi+/bt7N+/n/79++NyuejRowerVq1i0qRJJCcns3HjRho0aMB7773HiRMngP89k5eR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qFevHqmpqYwYMYK//vqLm266iZkzZ3LHHXfw448/8uyzz+ZTb0RERETO85sRu4u98sorpKSkEBISAsBHH33E+vXr+eWXXyhWrBgAhQsXZufOnZQuXZrChQt76x46dAiAgQMHMmDAAIKDg1m6dCmdO3e+7v0QERERuZjfjdiNGDGCr7/+mrlz53pvuU6cOJEKFSrQpk0bEhISvGW//fZbKlSoQHR0NNHR0URGRvLZZ58RFRXFpk2beOihh7j77ruZMmUKr7322iXP6XA4SE1N9fmIiIiI5Da/CXZpaWk8/vjjfPXVVyxfvpxSpUp591ksFr766itKlChB27ZtSUxMBCAwMJC+ffsSGxtLbGwszz77LAEBAaxcuZKePXty66230qZNGywWCwEBl/4pR48eTXh4uPcTFRWV5/0VERER/+MXwe706dM0aNCA48eP8/vvv2c5e9VqtTJv3jwCAgIYP348AAEBAXz00UdUqVKFKlWqMHHiRAICAihUqBCFChVi48aN3Hfffdx7773s27fvkuePiYkhJSXF+4mLi8uzvoqIiIj/8otn7CIiIvj0009p2bLlZUfWwsLCWLJkCZGR/1tSoV+/fowZMwY4fxsXwGQy8dtvvzF06FD69OnDnDlzCAoKuuRxrVYrVqs1dzojIiIicgl+EewAWrduna1yJUuW9Pn+4YcfMnv2bACSk5MZMmQIAK1atWLZsmUAuFwuMjIyLhvuRERERPKaX9yKvRSn03nZ14y53W6efvpp7zN2AwcOBM6P2Nntdm+5VatW0ahRozxvr4iIiMjl+M2IXVacTidOp/OS+y9+Z+x3333HnDlzePXVVylfvjz79++nevXqBAYGkpCQwIsvvpjj8w+qX4ywsLCraruIiIjIP5kMwzDyuxH/Bh6P57LP5+VEamoq4eHhpKSkKNiJiIjIZeUkN/j1rdicyK1QJyIiIpJXlFZERERECggFOxEREZECQsFOREREpIBQsBMREREpIBTsRERERAoIvwt2t9xyC9u3b8cwDNxud343R0RERCTX+NUCxRkZGfz+++9UqFCBw4cPU7t2bdxuN2azGZvNht1up02bNixcuDBT3YiICNatW0f16tUBiImJwePx8Pbbb191e8ZtO4ktJOOq64vIjWdow8grFxIRySN+Fez27NlDdHQ04eHhhIeHc/bsWQYPHkyFChX4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RxMeHu79REVFXfNvISIiIvJP/6pg16ZNG/bs2eNdWqRatWpXrLN//37q1KlDZGQky5Yto0iRIpnKREREsGjRIvbu3cvMmTOzPM7KlStp1qwZffv25ejRo/Tr148HHniA2NhYDh48CJwPiVmJiYkhJSXF+4mLi8t+p0VERESy6V8V7K5G5cqV+eabb/jyyy8v+wxduXLl2LRpE0899RRwfp27n3/+mQYNGrB27Vpq1arFO++8wyeffEJsbCxTp07l8OHDDBgwgMTERODSwc5qtRIWFubzEREREcltBTbYbd++nenTp+N0OrnllluyVad06dLevzMyMrjzzjvZunUrb775JpUrV+auu+4iMDCQ3r178+qrr7Jy5UrCw8OJi4vDYrFoAoWIiIjkq3/V5ImsBAYGsmvXLtxut3cNOoAvv/ySqVOn8sgjj2Sq43Q6gfOzai+lTZs21K5dG4CBAwcCsHv3bg4fPkx6ejrvvvsuhw4d4o033uC7777zmWmbXYPqF9PonYiIiOSaf32w6969O/379/eZEAFQuHBh3njjjUzr08H/gt2F/81KuXLlvDNnL6hRowYZGf97U4TT6aRVq1Zs3LiR11577Vq6ISIiInLNTIZhGPndiH+zw4cPExoaSkRERLbrpKamEh4eTkpKikbsRERE5LJykhv+9SN2+a18+fL53QQRERERoABPnhARERHxNwp2IiIiIgWEgp2IiIhIAaFgJyIiIlJA+PXkCcMwOHnyJEePHuXAgQPs3LmThIQEJk2alN9NExEREckxvwl2P//8M8888wwAZrMZq9VKeno6ZcqUITIyksjISE6dOkXz5s29rwhbtmyZt37jxo0pW7YswcHB3oWLLzh69CgvvPCC1rITERGRfOU3we6OO+7gq6++YsSIEfz444+cPn2aBg0a8MMPP3jXhKlXrx4dOnSgePHirF69mhdeeIGHHnqI5cuXM2DAAPr164fZbGbnzp0+x+7Vq9dVvU5s3LaT2EIyrlxQRAqkoQ0j87sJIlLA+M0zdgEBAdSqVYstW7bwww8/EBERQb169by3Xffs2cOJEyfo3r07ABaLhQoVKjBhwgRatmyJxWLBZDLhdruJjo72+cydO5eAAL/5KUVEROQG5TcjdnD+NWPPPfccR48eBeDZZ59l5cqVAIwfP57nnnvO+2qywMBAn7oWiwWPx4PZ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1atX9z77tm7dOrZt2+ZT5+uvv8Zms/Hf//7XW6dp06beOrNnz2bRokWZzvX777+zbt06lixZ4q13++23079/f2+Z9PT0vO20iIiISDb864JdRkYGcP7256ZNmwCuuI7chTotWrRg/vz52apzcb1u3bpx7733ZrueiIiISH741wW70aNHY7PZMJvNlC5dGjh/y/THH3+kSpUqwPmJEOXKlfPW+fzzz4mIiMBqtVK8eHFvnY8++oi5c+cCcPbs2UzPzi1fvpwyZcoQGBjonSxhGAavvfYaY8eOBc6vq/fkk09eVV8G1S92xYUGRURERLLrX7fcSYkSJTKFoYyMDDp16sS+ffvYt28fc+bM8Y62AZQtW9YbzC6u069fP2+dCRMm+NQBqFChAoGBgZnqjRo1yltvyJAhmeqJiIiI5Id/3SvFCoKcvBpERERE/FuBfqWYiIiIiGRNwU5ERESkgFCwExERESkgFOxERERECggFOxEREZECwm+CXVpaGi6X64rlDMPweZOEw+HIVMbtdudq20RERERyg98Eu1q1ahEUFITNZvN+rFYrJpMp07YSJUp4640cOZJOnTr5HKtmzZrs2LEDOL9G3t69e69rX0RERESy8q9788TV2rdvHxaLb3cnTpzIl19+yfr16322XxiRS05O5oMPPmDu3Lk4HA7sdjsHDhzA4/Fw+PBhTCYT6enp/P333wQEBHjffJFd47adxBaixY1FRCRvDW0Ymd9NkOvEb4LdP0Pd8ePHGTFiBF999VWmsmazGYAXX3wRs9lM7969MZlMfPfdd8TExHDixAneffddgoODSUtL4//+7/+48847iYmJuS59EREREcmK3wS7ixmGQZ8+fTh9+jQVKlRg27ZtREdHEx4e7i3z5ZdfsnjxYv766y+fW7O//PILderU4eOPP6ZKlSqUKlWK6dOnEx0dnQ89EREREfkfvwx2r7zyCikpKYSEhADw0UcfsX79en755ReKFSsGQPPmzXnsscdo0KABZrOZmjVr0r9/f1auXMnx48d58803CQ8P58yZM4waNQqbzcZ///tfypYtm59dExERET/md++KHTFiBDNnzmTNmjXUqFGDdevWUaVKFbp168bff//NsmXLfEbohg4dis1mY/jw4Rw9epRTp04REJB5zonL5aJ69eoUKlQo0z6Hw+EzuzY1NZWoqCiGrzqA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+Cp/GRG50ejtwCIi/59hGHTr1o1Dhw6RlpaGw+EgMTERm81GtWrVKFmyJCVLlmT37t3UrFmTxo0bs2/fPm/93bt306FDB3bu3MnOnTvp1asXmzZtuuT5rFYrNpvN+71WrVosXryYQoUKXfIdk/v372fgwIFMmzaN0qVLY7PZGDBgACNGjPCWWbhwIZ988kmW9d9//30sFgtVqlQB4LXXXqNLly5069aN0qVL5+TnEpEbkIKdiAjnQ53D4WDcuHEEBARQrFgxbDYbvXr1ok6dOgwZMsSnbHp6OoUKFeLIkSO0adMGAKfTSXx8PFWqVCEjI4OEhARvgKpWrRo//fQTcP62rNvtJiAggNjYWJYuXUrNmjU5cuQI5cqVw2w2ExAQ4C0LYDabOX78OLfffju9e/fm3nvvBSAgIIAPPviAuXPnett35swZGjZsmKmP8fHxvPPOO3z99deYTCYAbrnlFtq2bcvDDz/MokWLKFSoUC7/siJyPWmBYhERICEhgZtuugmr1eoNPRe2BwUFUaRIEe82wzCw2+389ddfpKamUqdOHZKTk70jdrGxsT4jditXrmTIkCHe0buNGzfy7LPPUrFiRSIjI1mzZg2vv/46Dz74ICEhIdjtdtxuN4ULF8bpdDJlyhQefvhh0tPTGT16NIMGDaJp06aMGzeObdu24XQ6M43Yffzxx3z//fc+be7UqRPBwcE+IRDg1KlTtGrVilKlSvHtt99e9kXnInJj04idiAhQokQJjhw5QmJiIsuWLfNu//DDD4mKiuLuu+/2brvzzjuJiIgAzo+OZcfFYXH//v1UqVIFt9tN48aN+f333/n888959dVX+e9//8uECRPYvXs3U6ZM8TlGoUKFGDVqFI8++iiBgYHceuut/P3330yePJmZM2f6lL3lllt8vg8bNozt27dneWu4aNGirFq1io4dO1KjRg3ee+89Hn744Wz1S0RuLAp2IiIXOXDgAEOGDOGNN94Azt8Kdblc2O12AIYMGcKvv/7qDXYA5cqVo06dOgBYLBYqVapEcHAwgHd71apVveW3bdtGzZo12blzJwC//vor5cuX580337xs2wzD4MUXX2TWrFn8/vvvJCQkYBgGzz//fKaybrebzZs306hRI7755hsmT57MyJEjL/sc3aeffsrq1auveqauiOQ/BTsRkYsEBQWRmJjoDXYJCQns3r3bO9J1+vRpzGYzcP6ZutKlS3sDGkCvXr2w2+3Mnj3b57gej4fk5GSCg4OpX78+lStX9tazWq18/fXXlCtXLtPSKRkZGQQGBmIymRg1ahQrVqygXLlyFClShCJFitCkSRNsNpvPiGDz5s1ZtWoVJUuWBODBBx+kUaNGVKhQgb59+/Lzzz8zfPhwNm/e7K1TuXJlqlatyhNPPJFbP6WI5AMFOxGRi2RkZBAREUHfvn0BmDNnDqVKleLmm28G4PXXX/dOaHj22Wf58ccfsVjO/6s0MTERk8lEZGQk0dHRnDlzhrS0NEqWLOmdnPHdd9/RvXt3n3MGBgbStm1bQkJCKFSoEBkZGbjdbubMmUN6ejobN26kdu3aDB48mCFDhtCsWTMOHTpEkyZNCA8P95lZC+dH6x588EHKli3Lhg0bMJlMVK5cGYDQ0FD++usvGjRo4K3n8XhISEigXLlyeffDish1oWAnInKRypUr8/7773u/h4WFERkZ6Z3dOmPGDMqWLQvARx995C23evVqunbtyi+//EL9+vVxOBy0atWK559/nscee+yK5zWbzd6Fgi/1jF1ISIj37woVKnDmzBl+/fVXChcuTOPGjb37LBYLR48ezfI8Ho+H2bNn89prr3m3JSQk4Ha7vf0SkX8vBTsRkYvcc889OBwOChUqhMlk4u+//yY2Npb9+/cDkJ6ezvDhw/nzzz+9dQzDYPHixf+vvbvnhSWK4zj+NYl4SFQimgkFiRVvQDJeAR0vQLHVdkqhIlGJQqVSeAOrUOhWIpOQSHTbKTQUKBAGu7Pcwt2N5d5ww811J99PNyfnzMOpfsnJ/z/09/czPj5OFEVcX18zNDT0oVD3GeVymbW1NQ4PD2ltbX13/sLCAvB8PFt3enpKb2/vh9ZL+t4MdpL0wt7eXtP1r/rYvdbS0sLS0hIzMzMUi0Xm5+eJoog4jhkdHWViYoLJyUlGRkaa1qVpSpqmACRJQnt7e6N/XV39V2T1Yoz62OPjIwCFQoGtrS1OTk64u7tjf3+frq6uN+94dXXF7Owsm5ublEolgiDg5uaGcrnM+vo6w8PDf7ZRkr4lg50k/RSGIZ2dnU0h6uLigt3d3aZ2Ig8PD1xeXnJ0dMT09DRnZ2ccHx9Tq9WYmpoijmNyuRxPT08cHBywsbFBFEXk83lWVlYa96lWq9zf33N7e8vAwAAdHR2NwgyAwcFB0jQlDEPiOG6MVyoVKpUK8Bwqt7e3AVhcXGR1dZW5ubmm70qShLGxMbq7u4njuHGs3NbWRj6fJwxDlpeXv3AnJf0rNiiWpE/Y2dmhWq2Sy+Xo6+v77bwkSQiC4E2hw1d6WUH72vn5OT09PX/t2ZK+B4OdJElSRgTvT5EkSdL/wGAnSZKUEQY7SZKkjDDYSZIkZYTBTpIkKSMMdpIkSRlhsJMkScoIg50kSVJGGOwkSZIy4geezfc/r/74PwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import jieba\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report, confusion_matrix\n",
    "import seaborn as sns\n",
    "import xgboost as xgb\n",
    "from xgboost import XGBClassifier\n",
    "\n",
    "# 设置Matplotlib支持中文字体显示\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# 1. 数据预处理\n",
    "def preprocess_text(text):\n",
    "    # 加载停用词表（需准备中文停用词文件）\n",
    "    with open('chinese_stopwords.txt', encoding='utf-8') as f:\n",
    "        stopwords = set(f.read().split())\n",
    "    \n",
    "    words = jieba.cut(text)\n",
    "    return ' '.join([word for word in words if word not in stopwords and len(word) > 1])\n",
    "\n",
    "# 加载数据\n",
    "df = pd.read_csv('final_labeled_comments.csv')\n",
    "df['processed_text'] = df['text'].astype(str).apply(preprocess_text)\n",
    "\n",
    "# 2. 文本分类（情感分析）\n",
    "# 标签编码\n",
    "label_map = {'positive': 0, 'neutral': 1, 'negative': 2}\n",
    "df['label'] = df['最终情感标签'].map(label_map)\n",
    "\n",
    "# TF-IDF向量化\n",
    "tfidf = TfidfVectorizer(max_features=2000)\n",
    "X = tfidf.fit_transform(df['processed_text'])\n",
    "y = df['label']\n",
    "\n",
    "# 拆分数据集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 3. 创建并训练XGBoost分类器（使用默认参数）\n",
    "xgb_clf = XGBClassifier(\n",
    "    objective='multi:softprob',  # 多分类问题\n",
    "    eval_metric='mlogloss',      # 多分类对数损失\n",
    "    use_label_encoder=False,     # 禁用标签编码器警告\n",
    "    random_state=42,\n",
    "    n_estimators=200,            # 适当减少树的数量\n",
    "    max_depth=5,                 # 中等深度\n",
    "    learning_rate=0.1            # 常规学习率\n",
    ")\n",
    "\n",
    "print(\"开始训练模型...\")\n",
    "xgb_clf.fit(X_train, y_train)\n",
    "print(\"模型训练完成!\")\n",
    "\n",
    "# 4. 模型评估\n",
    "print(\"\\n模型评估...\")\n",
    "y_pred = xgb_clf.predict(X_test)\n",
    "print(\"分类报告：\")\n",
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "# 5. 混淆矩阵可视化\n",
    "def plot_confusion_matrix(y_true, y_pred, classes):\n",
    "    cm = confusion_matrix(y_true, y_pred)\n",
    "    plt.figure(figsize=(8, 6))\n",
    "    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n",
    "                xticklabels=classes, yticklabels=classes)\n",
    "    plt.xlabel('预测标签')\n",
    "    plt.ylabel('真实标签')\n",
    "    plt.title('混淆矩阵')\n",
    "    plt.show()\n",
    "\n",
    "# 获取类别名称\n",
    "class_names = {0: 'positive', 1: 'neutral', 2: 'negative'}\n",
    "plot_confusion_matrix(y_test, y_pred, [class_names[i] for i in sorted(class_names.keys())])\n",
    "\n",
    "# 6. 特征重要性分析（简化版）\n",
    "print(\"\\n特征重要性分析...\")\n",
    "# 获取特征重要性\n",
    "importance = xgb_clf.feature_importances_\n",
    "feature_names = tfidf.get_feature_names_out()\n",
    "\n",
    "# 创建特征重要性DataFrame\n",
    "feature_importance = pd.DataFrame({\n",
    "    'feature': feature_names,\n",
    "    'importance': importance\n",
    "}).sort_values('importance', ascending=False)\n",
    "\n",
    "# 过滤掉无法解释的特征\n",
    "feature_importance = feature_importance[feature_importance['feature']!='nan']\n",
    "feature_importance = feature_importance[feature_importance['feature'] != '15']\n",
    "\n",
    "# 显示最重要的20个特征\n",
    "print(\"\\n最重要的20个特征：\")\n",
    "print(feature_importance.head(20))\n",
    "\n",
    "# 可视化最重要的20个特征\n",
    "plt.figure(figsize=(10, 6))\n",
    "top_features = feature_importance.head(20)\n",
    "top_features.plot(kind='barh', x='feature', y='importance', color='skyblue')\n",
    "plt.title('最重要的20个特征')\n",
    "plt.xlabel('重要性得分')\n",
    "plt.ylabel('特征词')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f09de78-6d3e-46d8-af5e-b89506498000",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
